Files
FESADev/docs/abaqus-tolerance/physics-validation.md
T

11 KiB

T5 후보 물리·시간 정확도 검증

검사일: 2026-10-19. pinned parent dd54b0ae1e68a313ac46933b886c865c85ec4432, branch dryforge/tolerance-t5. 이 기록은 T5의 선택 검사다. 물리 검증 closure는 FAIL이며, 후보 production 경로의 비선형 시간 정확도 R8은 미완료다. 새 강체 병진 oracle의 통과와 기존 strict algebra 검사의 통과로 전체 정확도·채택 가능성을 주장하지 않는다.

변경·독립 검토

변경은 기존 hht_dynamic_procedure_test.cpp의 HhtDynamicProcedure.CandidateRigidTranslationMatchesIndependentPhysicalOracle 한 검사와 이 기록뿐이다. Production·local kernel·T3 helper·probe·기존 판정 기준은 수정하지 않았다. 기존 검사 파일은 tests/CMakeLists.txt와 msvc/fesa_unit_tests.vcxproj 양쪽에 등록되어 있어 추가 source 등록은 필요 없다. 전체 CMake 실행은 T7 범위다.

새 검사는 HhtDynamicProcedureExecutor::Execute → ExecuteReducedHht의 실제 후보 경로를 호출한다. Fixture는 기존 두 disconnected unit-square shell의 density=2, thickness=.1, area=1을 그대로 사용한다. Nodal-lumped translational mass는 각 node .05, 총 질량은 .4다. 여덟 node 각각에 일정 global x CLOAD=1이므로 총 힘은8, 초기 및 이후 물리 가속도는20이다. 시간은 h=.25,T=.5,N=2,INC=3이며 source의 최대 증분을 변경하지 않았다. 독립 연속체 강체 해는 다음과 같다.

q_x(t) = 10 t^2, v_x(t) = 20 t, physical a_x(t) = 20
public A_x(t) = (1+alpha)20-alpha*20 = 20
T(t) = .5*.4*(20t)^2 = 80t^2
W(t) = 8*(10t^2) = 80t^2
Uphysical = Udrill = energy defect = 0

Frame0 및 두 endpoint를 모두 비교한다. All-free와 y/z/rotation을 영구속한 두 경우를 각각 실행하여 full q/v/a/A의 나머지 성분과 영 BC를 검사한다. 입력 힘, nodal inertia, 전역 force/moment balance, kinetic/physical/drilling energy, 일정 외력 work/defect와 두 positive increment의 hht-log-v2, policy ID, field_pass/accepted를 확인한다. 일반 수치오차 상한은 사용자 승인 실험의 1e-3이다. 단위 scale은 L=1,T=.5,E=20이며, 정확한 입력 힘·schedule·영 BC와 필수 global equilibrium 1e-8은 그대로 검사한다. 이 값은 Abaqus 기본값이나 production 내부 acceptance 완화를 뜻하지 않는다.

Root의 독립 검토는 source의 두 단위면적·rho·두께·CLOAD에서 M=.4/F=8/a=20을 재계산하고 q/v/a·energy 식, scale, 양 BC 및 로그 의미를 대조했다. 처음 실행한 더 엄격한 진단 버전도 통과했으나 최종 검사의 일반 오차 상한은 승인된 1e-3이다. 정확한 강체 해는 시간 오차가 roundoff 수준이고 a와 A도 같으므로 차수 >=1.8, N7 separation 또는 비상수 physical a/A 구분의 증거가 아니다. 해당 구분은 아래의 기존 algebra/rate/writer 검사 범위와 함께 해석해야 한다.

현재 실행 evidence

공유 evidence root는 workspace root 기준 .build/tolerance-experiment/go-20261018/T5/다. 실제 cwd는 .dryforge/worktrees/T2이며 다른 workspace·main·dev는 수정하지 않았다. 원본 reference·reference/temp·외부 Abaqus 실행·다운로드는 사용하지 않았다.

실행 실제 선택 PASS FAIL SKIP native exit
최종 Native Release probe ON 153 144 8 1 1
최종 Native Debug probe ON 28 27 0 1 0
보존 strict Release C08 대조 5 0 5 0 1

Release/Debug unit discovery는 각각887개로 identity가 일치했다. 최종 filter의 선택 identity와 XML을 대조하여 missing/extra/duplicate=0을 확인했다. 범위 밖 identity는 verification.json의 excluded에 보존했다. 위 행은 서로 중복되는 검사를 포함하므로 합쳐서 unique 통과 수로 보고하지 않는다. Release153의 elapsed69.325초와 Debug28의25.638초는 일부 동시 검사의 verification timing이며 공식 성능 측정이 아니다.

  • final-selected-release.command.txt, .raw.txt, .xml, .exit.txt: 물리·time/algebra·reduced/rate/partial-BC·energy·state/writer·요소 정확도153개.
  • final-selected-debug의 같은 네 파일: 새 oracle, 기존 후보 extension/history, time/energy/algebra·state/writer28개. .exit.txt=0에도 N7 SKIP1개가 있다.
  • strict-physics의 같은 네 파일: 보존 strict 바이너리 C08 실패 대조5개. 초기 상대 baseline 경로의 launch 오류는 strict-physics-initial-launch-error.txt에 별도 기록했다. 이 launch는 native 실행이 아니며 검사 수에 넣지 않았다.
  • build-approved-release.raw.txt/.exit.txt, build-approved-debug.raw.txt/.exit.txt: 직접 MSBuild 재빌드 둘 다 exit0. 실제 VS 환경·target·probe 옵션은 build-final-release.cmd, build-final-debug.cmd에 있다.
  • final-run-binary-hashes.json, verification.json: 실행 전후 binary/source/DLL SHA256, cwd/branch, 각 test identity·실패·skip, literal command와 제외 목록. summarize.py와 summary.raw.txt/.exit.txt는 XML/filter/discovery 대조를 재현한다.

최종 unit binary SHA256은 Release 1dbb49aaacbb48ea483c4cba3b98805fa6b89f65cf4c61b428fc5e60f98b4492, Debug 248b23c0d2a1e3441424b6051fe5d54f648104e04fa22e3a403a41b680ded3d2다. 보존 strict binary 272a1829d6440dac32011dc30943bd8213b8bce5cbd4239243fb448f237be922는 baseline/test-runtime-hashes.json과 일치한다. inherited GTEST filter/shard를 제거하고 FESA_HHT_PROBE_OUTPUT을 unset했으며 짧고 분리된 TMP/TEMP C:/ft5f, C:/ft5g, C:/ft5b를 사용했다.

정확도 실패와 strict 대조

최종 Release의 다음8개 identity는 FAIL이다. 수치 gate를 변경하여 합격시키지 않았다.

identity (suite 생략 표기) 현재 실패 evidence
HhtShellPhysics.C08aRigidOrbitMatchesIndependentVolumeForcePowerAndMomentum pointwise hidden 최대 .0012337114403665182 > .001; t=.0625 이후 여러 CompleteEquilibrium 실패
HhtShellPhysics.ReducedManufacturedControllerKeepsExactInitialOrbit h=1/64, increment1에서 strict outer100 소진
HhtShellPhysics.C08aRigidManufacturedOrbitReducedCoordinateTimeConvergence 첫 grid h=1/16, increment1에서 strict outer100 소진
HhtShellPhysics.PredictorStartCompletesPreviouslyFailingLumpedFreePlateGrid h=1/256, increment1에서 strict outer100 소진
HhtShellPhysics.C08bFreeFiniteRotationPlateSelfConvergenceAndPhysicalInvariants 첫 grid h=1/64, increment1에서 strict outer100 소진
DynamicRotation.ThirdDerivativesMatchAllPermutationsAndInteriorSweep 독립 D3 norm error .22761592213997162 > .001
DynamicRotation.MatchesEightyDigitIndependentBlockExponentialAnchors 독립 anchor error .22761592213997159 > .001
NonlinearMitc4Residual.ExactDrillingConstraintHasIndependentForceGradientAndHessian gradient error .0032913506131779374 > .001

보존 strict 바이너리에서도 C08의 위5개가 모두 같은 hidden/equilibrium 및 같은 첫 증분·grid의 correction budget 실패로 끝났다. RunPlate는 source상 자체 strict residual/correction 1e-10을 사용한다. 이 대조는 후보 field 정책 때문에 C08 harness의 새 실패가 생겼다는 주장을 뒷받침하지 않으며, 후보 production의 시간 정확도가 통과했다는 뜻도 아니다. Local D3/drilling의 세 실패는 T2에서 이미 기록한 local 근사의 부적합과 같고 현재 raw 결과도 남겼다. 본 태스크는 local 근사를 수정하거나 physics 기준·kernel·HHT 계수·outer/controller를 바꿀 권한이 없다.

T4의 동일 production SHA evidence는 추가로 재사용한다: ../T4/final-native-{release,debug}-selected.xml 각각86개 중84PASS/2FAIL 및 strict-baseline-related.xml의2FAIL이다. T5의 수정은 test-only라 production SHA는 불변이다. LargeDirect는 후보 field-pass 뒤 dynamic-invalid-mass-null, Uniform은 첫 강체 병진 이후 finite-rotation increment2의 triad gate에서 실패했다. 보존 strict는 두 검사에서 outer100 소진, 특히 Uniform의 첫 병진에서 막혀 후속 finite rotation에 도달하지 않았다. 따라서 후속 triad 실패의 원인이 strict와 같다고 단정하지 않는다. T4의 후보 output-failure rollback/accepted-once와 CLI old-final 보호 evidence도 그 범위로만 사용하며 이를 새 시간수렴 또는 T7 전체 검사 통과로 세지 않는다.

통과 범위와 남은 R8

현재 실행에서 partial rotation BC/null 교집합·exact-zero, physical rate 복원, full/augmented tangent와 restricted defect, fixed chart/transpose·rank/regularity, pair/RN-even·zero-scale·nonfinite 산술, lifecycle rollback, state/source identity, schema2/writer의 endpoint/A 분리·부분 moment reaction·old-final 보호 검사가 통과했다. 실제 후보 연결은 새 강체 oracle 및 기존 extension/history/lifecycle 검사로, 각 operator·합성 writer fixture의 검증과 구분한다.

C01/C03/C04a/C04b는 생산 시간 helper를 쓰지만 자체 strict Newton/algebra harness다. 아래는 최종 Release raw에서 추출한 q/v/physical-a의 finest normalized error 및 마지막 두 refinement 차수의 channel별 최솟값이다. 모든 해당 channel은 감소했고 차수 >=1.8, 기존 더 엄격한 finest1e-4도 만족했다. 이를 후보 field path의 R8로 승격하지 않는다. 사용자 승인 finest1e-3을 적용하기 위해 기존 검사를 완화할 필요도 없었다.

algebra model finest q / v / physical a 최소 마지막 차수 q / v / a
C01 1.10353e-5 / 4.26133e-6 / 1.10353e-5 1.99948 / 1.99851 / 1.99948
C03 variable mass 1.10242e-6 / 3.42816e-7 / 9.26995e-7 1.99989 / 1.99477 / 1.99886
C04a coupled massless 5.26648e-6 / 4.20639e-6 / 1.05330e-5 1.99977 / 1.99472 / 1.99977
C04b moving null 1.62408e-6 / 1.66011e-6 / 3.16757e-6 1.99932 / 1.99962 / 2.00237

별도의 HhtTemporalVerification.C04aFinestReductionComparisonIsNumericallyResolved는 Release/Debug 모두 SKIP이다. h=1/256 full/reduced acceleration defect 3.0790209097630861e-10이 arithmetic/solve resolution 6.2961354117696263e-10보다 작아 판정 불가다. C04a의 위 analytic 시간수렴 통과와 이 comparison SKIP을 섞지 않는다. C07 energy·spectrum·reaction, C02 STEP oscillator, 비상수 a/A helper 검사는 통과했으나 이는 실제 후보 nonlinear shell의 energy/시간수렴 closure를 대신하지 않는다.

R8의 실제 후보 nonlinear shell q/v/physical-a 마지막 두 refinement·order>=1.8· finest<=1e-3·기존 N7 separation은 아직 충족하지 못했다. C08 시간 검사는 첫 grid에서 실패하여 마지막 refinement와 invariant 감소 판정까지 도달하지 않았다. 별도의 유효한 비선형 production analytic oracle도 구성하지 않았으며, 미세 grid를 외부 truth로 삼거나 선형 근사를 exact nonlinear truth로 대입하지 않았다. 실패/미평가를 PASS로 세거나 hidden retry/polishing·failed-frame commit으로 성공을 만들지 않는다.

현재 결과는 T6 장시간 성능 측정의 수치 승인 근거가 될 수 없다. 독립적으로 남은 범위는 local 근사의 독립 정확도 부적합, candidate finite-rotation acceptance 실패, candidate 비선형 시간수렴·N7/physical invariant closure다. 전체 Native Debug, 전체 CMake CTest, 별도 Python 및 필수 reference 검증은 T7의 별도 실행 결과를 따른다.