# MITC4 HHT 외부 field 수렴 정식화 작성일: 2026-10-18. 코드 대조 revision: `d7f6d0c`. 정책 ID: `abaqus2025-field-on-fesa-v1`. 상태: 구현 계약이며 구현·수치 통과 보고가 아니다. ## 적용 범위와 근거 이 문서는 [적용 계획](application-plan.md)의 T1 산출물이다. 양의 증분의 nodal-lumped-kinetic / reduced-coordinate / fixed-null MITC4 HHT 외부 Newton 종료만 교체한다. 통상 `fesa.exe ` 경로가 이 후보를 실제 사용해야 한다. runtime option, `*CONTROLS` parser, 정적·Hex8·열·eigen 변경은 없다. dt=.1, T=10, 100증분과 최대100 outer correction은 유지한다. frame0은 기존 strict 절차다. 2026-10-18 아래 공식 2025 페이지를 직접 열고 확인했다. - [S1 Commonly Used Control Parameters](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-convergecontrol.htm): field 제어와 반복 제어의 구분 및 IP. - [S2 *CONTROLS](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEKEYRefMap/simakey-r-controls.htm): STRICT 기본 모드와 FIELD 두 데이터 줄. - [S3 Convergence Criteria for Nonlinear Problems](https://docs.software.vt.edu/abaqusv2025/English/SIMACAEANLRefMap/simaanl-c-convergcriteria.htm): Terminology, Average Flux, Residuals, Zero Flux, Negligible Response, Linear Increments, Nonquadratic Convergence. S2의 기본값은 Rn=.005, Cn=.01, Rp=.02, ε=1e-5, Cε=.001, Rl=1e-8, Cf=1, εl=1e-5, εd=1e-8이고 첫 step의 초기 평균은 각 flux 단위로 .01이다. IP=9이며 평균 override는 없다. 이하 식은 공개 규칙을 FESA 물리량에 대응한 것이다. 특히 **비이차 검출·평균 초기화·occurrence 활성화·분기 우선순위는 아래의 명시적 FESA 선택**이다. Abaqus의 비공개 구현과 동일하다는 주장이 아니다. 2024 생성 INP의 실제 solver 설정은 .msg/.dat 부재로 미확인이다. 이를 기다리며 2025 후보 구현을 중단하지 않는다. ## 물리량과 소유권 field α=F는 global 병진 u, α=M은 global total rotation-vector φ다. 둘 다 모델에 존재하면 모든 활성 field가 통과해야 한다. 활성 field는 해당 종류의 **free full DOF가 하나 이상**인 field다. all-constrained field는 검사 대상 없음으로 기록하고 전체 AND의 항등원으로만 취급한다. 모델 flux 모집단에서는 constrained DOF도 제거하지 않는다. 같은 trial (q,v,physical a)의 기존 endpoint 잔차를 그대로 쓴다. ```text E = I(q,v,a) + fint(q) - F Jα = 해당 field의 full free DOF 집합 ρα(i) = max(j∈Jα) |E_j(i)| [force 또는 moment] ``` 종속 절점이 없는 지원 subset이므로 S3의 fi=1이다. fixed-null chart의 reduced 좌표/hidden 변수는 종속 절점 수가 아니다. reduced projected residual만으로 통과시키지 않는다. 회전의 E·flux·보정은 φ와 켤레인 generalized moment/rotation chart다. `Jl^-T`로 변환한 spatial reaction moment나 lever-arm global moment를 섞지 않는다. 증분 n의 iteration i는 완료된 outer correction 수다. i=0은 선택된 시작 trial이며 predictor와 old-position 시작점의 비교 평가 중 **선택된 하나만** 이력 표본이다. 후속 trial 재구성까지 마친 full q(i)를 사용한다. ```text Dα(i) = max(j∈Jα) |q_j(i) - q_j(n-1,accepted)| cα(i) = max(j∈Jα) |q_j(i) - q_j(i-1)| (i>=1만 정의) ``` q의 회전 성분은 total φ다. 두 차분 모두 같은 고정 full chart에서 계산한다. i-1은 같은 증분의 직전 **선택된 평가 trial**이며 accepted 이전 증분이나 predictor가 아니다. full 재구성 후 차분을 써서 nonlinear graph root 변화도 포함한다. `MapAugmentedCorrection.coordinate`의 접선 lift만을 실제 endpoint 차분으로 간주하지 않는다. 병진 단위는 입력 길이, 회전은 rad다. V/a/A의 차분은 이 c가 아니다. i=0의 c 및 추정 보정은 미평가이며 0으로 채워 통과시키지 않는다. 기존 [ReferenceLength](../../src/fesa/analysis/hht_dynamic_assembly.cpp)는 초기 shell의 네 edge 길이 중 모델 최대 L을 계산하고 유한 양수인지 검사한다. L을 아래 차원 변환과 미소 병진 예외에 그대로 사용한다. Abaqus 내부 특성길이와 같다고 가정하지 않는다. 단위계 변환 때 L·힘·모멘트가 함께 변환되어야 한다. ## 공간 평균: 조립 전 signed total과 source 개수 같은 trial의 각 요소 e, local node a, field component k에서 다음 scalar occurrence를 만든다. ```text x(e,a,k) = fint_e(a,k) + I_e(a,k) = f.internal_force[row] + m.force[row] b(e,a,k) = |x(e,a,k)| ``` `f.internal_force`에는 기존 physical+drilling 성분이 포함되고, `m.force`는 같은 physical a의 M a+convective inertia다. **요소 내부에서 signed total을 먼저 더하고 그 후 abs**를 취한다. `|fint|+|I|`, 전역 조립 후 `|Σx|`, 기존 `residual_scale`의 `|physical|+|drill|+|convective|+Σ|M_rc*a_c|`는 대체물이 아니다. 요소 연결 수가 다른 절점도 node 평균으로 압축하지 않는다. 외부 occurrence는 `Load::ComputeContributions`가 반환하는 source별 scalar contribution 하나마다 `b=|entry.value|` 하나를 만든다. 같은 full DOF의 서로 반대 load도 두 개로 남긴다. source load 순서, 그 안의 target/contribution 순서를 보존한다. 반환된 명시적 0 contribution도 모집단에 포함한다. 반환되지 않은 방향의 0 load를 인위적으로 추가하지 않는다. 현 지원 subset은 일정 global 병진 CLOAD뿐이다. field별 목록 Bα는 요소 source 순서→local node→component 순서, 그 뒤 외부 source 순서다. 각 요소는 해당 field의 12개 scalar를 제공한다. constrained 포함이며 없는 field의 entry는 만들지 않는다. 병렬 worker는 index별 응답만 만들고 이 순서대로 serial reduction한다. source identity를 내부 index 값으로 바꾸지 않는다. ```text mα(i) = max Bα(i) Hmaxα = 이전 accepted 증분들의 mα 산술평균; 표본 없으면 0 Aα(i) = {b∈Bα(i) : b >= εl*Hmaxα} Busedα = Aα(i), if mα(i) >= .1*Hmaxα Bα(i), otherwise bbarα(i) = sum(Busedα)/count(Busedα) ``` 비활성화는 **scalar flux occurrence 단위**로 한다. 한 global DOF에 붙은 서로 다른 요소 occurrence의 활성 상태를 합치지 않는다. 공개 문헌은 mixed incidence의 세부 marking을 제공하지 않으므로 이것은 element-node-component 모집단을 보존하는 FESA 선택이다. 같은 값/threshold에서는 활성이다. Hmax=0이면 0도 활성이라 첫 trial은 전체 모집단이다. m<.1Hmax에서는 전체를 다시 활성화한다. count=0이면 평균을 나누지 않고 invalid-flux-population 실패다. m=0,Hmax>0은 전체 재활성화로 bbar=0이다. 활성 DOF 없는 field도 가능한 한 모집단 진단을 계산하되 그 성공으로 free residual 검사를 대신하지 않는다. ## 시간 평균 후보와 field 차원 변환 field별 committed 이력은 (Sα,Nα,Kα,Mα)다. S,N은 비zero accepted bbar의 합/개수, K,M은 모든 accepted 증분의 m 합/개수다. Hmax=K/M (M>0)이며 M=0이면 0이다. frame0은 표본이 아니다. 합·count 및 아래 산술은 유한/overflow를 검사한다. 각 iteration에서 **같은 committed 이력**으로 다음 후보를 다시 만든다. ```text baseα = Sα/Nα (Nα>0), else .01 Nα=0: eligibleα = (bbarα > ε*baseα) Nα>0: tα = (Sα+bbarα)/(Nα+1) eligibleα = (bbarα > ε*tα) qtildeα = (Sα+bbarα)/(Nα+1), if eligibleα baseα, otherwise ``` N=0에서 initial .01을 보존하는 조건과 N>0에서 current-included 평균을 먼저 시험하는 조건을 구별한다. 이는 S3의 초기값 유지 및 자기참조적인 nonzero 표본 정의를 결정적으로 풀기 위한 FESA 규칙이다. qtilde는 iteration마다 달라질 수 있지만 S,N,K,M은 증분 도중 불변이다. 과거 eligible 여부는 재분류하지 않는다. 비zero 증분은 시간폭 가중이 아닌 **증분 표본 산술평균**이다. 첫 step만 지원하므로 이전 step 전달은 이번 구현 대상이 아니다. 최종 accepted trial의 eligible에 대해 pending 이력은 다음과 같다. ```text S' = S+bbar, N' = N+1, if eligible S, N, otherwise K' = K+m, M' = M+1 ``` 따라서 nonzero 평균만 거르는 S/N과 모든 accepted 최대 flux를 평균하는 K/M은 서로 다른 모집단이다. 실패 또는 미완료 증분에서는 네 값 모두 이전 값 그대로다. 먼저 두 field의 raw qtilde를 독립 계산하고 다음 치환을 **동시에 한 번만** 한다. ```text convF = Cf*qtildeM/L convM = Cf*L*qtildeF sα = convα, if bbarα <= qtildeα < convα and 다른 field 활성 qtildeα, otherwise zα = (bbarα <= ε*sα) να = ρα/sα ``` s는 해당 iteration의 판정 scale이다. 치환된 s를 상대 field 변환이나 committed 평균에 되먹이지 않는다. 이 동시 평가 순서와 모든 잔차 분기에 같은 s를 쓰는 것은 FESA의 명시적 대응이다. `time_average_flux`는 raw qtilde, `residual_scale`은 치환 후 s를 기록해 차이를 숨기지 않는다. εl 활성화는 Hmax에만 의존하며 s로 다시 계산하지 않는다. 필수 s는 유한 양수여야 한다. 음수·NaN·Inf·overflow는 즉시 실패이며 0/0을 0으로 만들지 않는다. ratio 대신 양수 scale에 threshold를 곱해 비교해도 곱셈 유효성을 확인한다. absolute floor, `max(1,scale)`, clamp는 없다. ## 보정 추정과 비이차 검출 정상 분기에서 i>=2이고 같은 증분의 ρα(i-1),ρα(i-2)가 모두 유효할 때만 다음을 정의한다. qtilde*normalized residual은 fi=1에서 원래 ρα다. ```text denα = min(ρα(i-1), ρα(i-2)) cestα(i) = [ρα(i)/denα] * cα(i) (denα>0) ``` 이는 S3의 다음 Newton correction 추정식에 대응한다. missing history 또는 den=0이면 추정은 미평가다. 이 경우 실제 보정으로 통과할 수 있지만 추정 unavailable을 면제/통과로 간주하지 않는다. 입력·중간 연산·결과의 NaN/Inf/overflow는 추정 미평가로 숨기지 않고 전체 invalid-state 실패다. i=0의 ρ는 첫 잔차 이력 표본이며 c는 없다. 추정값 0은 분모 양수·분자0·유효 c가 실제 존재할 때만 가능하다. S3는 IP 이후 선형 속도 수렴에서 Rp 사용을 설명하지만 검출 세부 알고리즘은 공개하지 않는다. 다음은 **Abaqus 검출식이 아닌 보수적 FESA 검출식**이다. ```text nonquadraticα(i) = i>9 AND ρα(i-2)>ρα(i-1)>ρα(i)>0 AND ρα(i)/ρα(i-1) >= ρα(i-1)/ρα(i-2) ``` 두 번 연속 감소하면서 감소 비율이 개선되지 않는 경우만 인정한다. 엄밀한 등비 선형 감소는 포함하고 quadratic 감소·증가·정체·zero는 제외한다. 정규화가 변해도 ρ 이력을 써 거짓 수렴률 변화를 피한다. 반복9는 불가, 반복10부터 가능하다. history 부족/0 분모는 false이며 비율 산술 실패는 전체 invalid-state 실패다. quasi-Newton을 새로 추가하지 않는다. 이 식은 일부 비이차 수렴을 더 늦게 받아들일 수 있으며 Abaqus 내부 분기 재현을 보장하지 않는다. 검출 threshold를 임의로 추가하거나 9회 뒤 무조건 Rp로 바꾸지 않는다. ## 분기 우선순위와 판정 모든 비교는 아래의 <=, <, > 경계를 그대로 사용한다. candidate 상태가 유효하고 모든 활성 field의 s를 구한 뒤 다음 순서로 평가한다. 1. i>=1이고 **모든 활성 field**가 ν<=Rl이면 전부 `linear`: residual_pass=1, correction_pass=not-evaluated, field_pass=1. i=0에서는 한 번도 Newton correction을 하지 않았으므로 linear 면제를 쓰지 않는다. 2. 남은 경우 각 field에서 z가 true이면 `zero-flux`: residual_pass=(ν<=ε). 통과하면 correction은 미평가이고 field_pass=1. 아니면 유효 실제 c에 대해 correction_pass=(c<=Cε*D), field_pass=correction_pass다. **OR 규칙**이며 Cn·Rp·추정 보정을 섞지 않는다. 3. z=false이고 nonquadratic 검출이 true이면 `nonquadratic`: residual_pass=(ν<=Rp), correction_pass=(유효 실제 c<=Cn*D), field_pass=두 pass의 AND다. 이 분기에는 cest를 사용하지 않는다. 4. 나머지는 `normal`: residual_pass=(ν<=Rn), correction_pass=(유효 실제 c<=Cn*D OR 유효 cest<=Cn*D), field_pass=두 pass의 AND다. S3의 미소 병진 예외는 normal/nonquadratic의 **Cn 보정 요구**에만 적용한다. force field에서 D<εd*L이면 correction_pass=not-evaluated로 면제하고, field_pass=residual_pass다. D=εd*L에서는 면제가 아니다. moment에는 길이 예외가 없다. zero-flux의 Cε 요구는 면제하지 않는다. i=0에서는 이 예외로 가짜 correction을 만들지 않으며, Cn 기반 통과는 허용하지 않는다. 단 zero-flux의 ν<=ε 잔차 단독 통과는 i=0에서도 실제 잔차 검사이므로 가능하다. normal/nonquadratic의 D=0에서 면제가 없으면 c=0만 cross-product 기준을 만족하며 c/D division은 하지 않는다. 분기 순서는 공개 원문의 설명 순서를 실제 구현 가능한 형태로 고정한 FESA 선택이다. 예를 들어 하나만 Rl을 통과하면 linear로 개별 면제하지 않고 각자 zero/normal/ nonquadratic을 검사한다. 미활성 field는 `branch=not-evaluated`, field_pass=not-evaluated이며 전체 field AND에서 제외한다. 전체 `field_pass`는 활성 field들의 pass AND이며 후속 acceptance와 다르다. 필수 보정이 missing이면 field_pass=0이고 correction_pass=not-evaluated다. 두 비교 중 하나라도 유효 true인 정상 보정 OR만 통과한다. ## 실행 연결과 transaction 경계 현재 source를 직접 확인한 결과와 필요한 연결점은 다음과 같다. | 소유 위치 | 실제 현재 동작과 후보에 필요한 작업 | | --- | --- | | [hht_dynamic_assembly.cpp](../../src/fesa/analysis/hht_dynamic_assembly.cpp) / EvaluateAssembly | indexed local 결과를 e,row 순서로 serial reduce. f.internal_force[row], m.force[row]의 signed total을 global scatter 직전에 수집해야 한다. 기존 residual_scale은 strict 진단을 위해 보존한다. | | 같은 파일 / AssembleLoads | 외력 signed 합과 absolute row 합만 반환한다. 이 두 벡터로 source 개수를 복원할 수 없다. ComputeContributions 순회 중 별도 occurrence를 보존해야 한다. | | [hht_reduced_procedure.cpp](../../src/fesa/analysis/hht_reduced_procedure.cpp) / evaluate_trial | graph root·physical rate 재구성 후 assembly. 시작점 비교·inner root용 보조 평가를 outer 이력에 넣지 않는다. | | 같은 파일 / ResidualRecord·CorrectionRecord | 현재 strict residual_pass AND correction_pass가 종료 조건이고 i=0 correction_pass=true 초기화가 있다. 후보 종료와 strict 로그를 분리하며 이 초기 true를 후보에 전용하지 않는다. | | 같은 파일 / accepted 후보 생성 | CompleteConstraintEvidence, CompleteEquilibrium, CheckGraphRegularity, CheckReducedUpdates 뒤 frame/history 반환. 후보 field pass는 이 검사들을 건너뛰지 않는다. | | 같은 파일 / RunReducedHhtStep commit callback | state.CommitAcceptedFrame 성공 뒤 private history 교체. flux history candidate도 이 transaction에 묶어 한 번만 commit한다. | | [hht_dynamic_procedure.cpp](../../src/fesa/analysis/hht_dynamic_procedure.cpp) | 실제 executor가 ExecuteReducedHht에 연결된다. 별도 시험용 판정만 추가해서는 CLI 동작 변경이 아니다. | flux snapshot, 직전 selected full q, 최근 세 ρ와 validity, pending S/N/K/M은 analysis-private procedure가 소유한다. Element·Domain·integrator에 accepted 이력을 옮기지 않는다. 매 trial은 immutable committed snapshot에서 pending 후보를 만든다. field 수렴 및 **모든** 후속 gate 뒤에 frame·private history·flux history를 같은 acceptance로 commit한다. log write/flush 실패도 정상 accepted 공개를 만들지 않는다. 실패가 commit 도중 발생하면 해당 증분의 state/private/flux history를 함께 이전 snapshot으로 유지하거나 rollback한다. current frame만 바뀐 부분 commit을 호출자에게 반환하지 않는다. 실패 trial, inner 평가, 재평가, 시작점 대안, 실패 출력/재시도는 committed 이력에 표본을 추가하지 않는다. retry가 있다면 local residual/correction 이력도 새로 시작한다. 이 정책은 기존 고정 dt 실패를 자동 cutback이나 strict 재시도로 바꾸지 않는다. `CorrectionRecord`의 δq/L,hδv/L,h²δa/L,h²δA/L(회전 scale=1) <=1e-10은 strict 비교 진단이다. 후보에 AND로 숨겨 종료를 지연시키지 않는다. 반면 `PrivateCorrectionEqual`의 full/private acceleration 산술 일치는 별도 유지 검사다. 기존 angular-only 선택의 strict 병진 residual·보정·private 산술 자격도 유지한다. 후보 force field_pass를 angular-only 선택 자격으로 쓰지 않는다. frame0, inner graph/hidden/rank/null/regularity, physical rate 복원, linear backward1e-12, update1e-12, pair/RN-even/finite/영 BC, global force/moment1e-8, HHT 계수와 schema2/source identity/final 보호는 유지한다. field pass 뒤 이 gate가 실패하면 정상 결과를 공개하지 않는다. 자동 완화·polishing·숨은 strict 재시도로 성공을 만들지 않는다. 현재 local kernel은 사용자 승인 실험인 polar1회, ExpSkew/Jacobian3차, mass4gate1e-3과 관련 inertia/tangent/HHT physics test 오차1e-3이다. 기존 exact equality·negative control·실제 controller는 유지한다. 최신 선택50개 중4FAIL이라는 한계를 보존하고 strict/candidate에 같은 kernel을 쓴다. 이 근사나 test 오차를 Abaqus 기본값 또는 후보 field 검증 통과로 보고하지 않는다. ## 로그 소비 계약 후보 record는 `record=dynamic-newton-iteration`, `schema=hht-log-v2`, `policy_id=abaqus2025-field-on-fesa-v1`이다. 기본 키는 다음 순서다. ```text record schema policy_id step increment time iteration stage outcome failure_code field_pass accepted ``` 뒤이어 force_,moment_ 각각 아래 suffix 순서로 기록한다. ```text residual_numerator residual_scale spatial_flux time_average_flux correction_numerator increment_norm estimated_correction residual_threshold correction_threshold residual_unit correction_unit branch residual_pass correction_pass field_pass ``` residual_numerator=ρ, residual_scale=s, spatial_flux=bbar, time_average_flux=raw qtilde, correction_numerator=실제 c, increment_norm=D, estimated_correction=cest다. residual_threshold는 무차원 Rl/ε/Rp/Rn, correction_threshold는 Cε/Cn이며 면제이면 not-evaluated다. 단위는 force의 residual_unit=force, correction_unit=length, moment의 residual_unit=moment, correction_unit=rad다. 힘·길이는 INP의 일관 단위계를 따른다. branch는 위 5개 enum만 허용한다. 미평가 numeric/bool은 literal `not-evaluated`, 평가 bool은 `0` 또는 `1`이다. 실패 전 이미 평가한 값은 유지하고 이후 미평가값은 이전 record 값으로 채우지 않는다. strict_ prefix는 기존 residual numerator/scale와 q/v/a/A norm·pass 진단에 붙인다. strict 결과는 후보 field_pass와 분리한다. 각 record는 UTF-8 한 줄, LF 종결, 실제 tab으로 key=value를 구분한다. value의 backslash/tab/LF/CR는 각각 `\\`, `\t`, `\n`, `\r`로 escape한다. 첫 '='만 key/value 경계이며 value 안 '='는 보존한다. 중복 key·없는 필수 key· 알 수 없는 enum·numeric NaN/Inf는 reader 오류다. finite numeric은 locale-independent round-trip binary64 표현, index는 10진 비음수 정수다. step은 raw source step 이름을 escape하고 increment/time은 기존 schedule identity다. `stage=evaluation,outcome=candidate,accepted=0`은 field 통과 전후에도 가능하다. 모든 유지 gate와 state/history commit 성공 뒤에만 `stage=accepted,outcome=accepted,accepted=1` record를 쓴다. 실패는 outcome=failed, accepted=0 및 실제 failure_code다. 완결 accepted 로그도 final HDF5 저장 성공을 대신하지 않는다. 다른 procedure의 로그·CLI·INP·HDF5 schema는 바꾸지 않는다. ## 독립 oracle에 필요한 경계 예 다음은 source fixture를 복제하는 대신 손으로 계산할 수 있는 입력/기대값이다. T3에서 각 threshold의 바로 아래·같음·바로 위와 nonfinite 실패를 추가한다. | 입력 | 기대값 | | --- | --- | | Hmax=10. 두 요소에서 같은 global DOF total은 각각 8-6=2와 -2; 외부 source 두 개는 같은 DOF에 +3,-3. 나머지 요소/외부 성분은0 | 전체30개(요소24+외부6) 중 비활성0 26개를 제외한 목록 [2,2,3,3], 평균2.5. m=3>=.1Hmax. 조립 residual=0이어도 평균0 아님. Hmax=0이면 전체 평균10/30이다. | | Hmax=100, 목록 [0,.001,10] | εlHmax=.001, m=10=.1Hmax: 평균(.001+10)/2=5.0005. 0은 제외, .001은 포함. m<10이면 전체 재활성. | | N=0, base=.01, bbar=1e-7 | εbase와 같으므로 initial .01 유지, zero-flux. 바로 위는 첫 표본 후보 qtilde=bbar. | | S=10,N=1,bbar=30 | pending qtilde=20. 같은 증분 재평가 bbar=70이면40; (10+30+70)/3으로 중복 누적하지 않음. | | L=2,qtildeF=3,qtildeM=.2,bbarM=.1 | sM=6, raw qtildeM=.2 유지. sF=3. force에서 변환된6을 역변환하지 않음. | | ρ 이력 [8,4,2], c=.04,D=1 | cest=.02. 실제와 추정 모두 Cn=.01을 넘음. 이력 [8,4,1]이면 cest=.01로 경계 통과. | | 앞선 ρ 중 하나0 또는 i=1 | 추정 미평가. 실제 보정 실패를 추정 미평가로 통과시키지 않음. | | i=9 또는10, ρ=[8,4,2] | i9는 normal, i10은 nonquadratic. [16,4,1]도 일정 비율로 검출; [16,4,.5]는 비율 개선으로 normal. | | s=2,ρ=2e-5,bbar<=2e-5 | zero-flux 잔차 경계 통과. ρ가 바로 위면 실제 c<=.001D를 요구. | | νF=1e-8,νM=1.1e-8 | 모든 field linear 아님. 각 field를 개별 분기로 검사. | | DF=εdL,DM=0 | force 길이 면제 없음. moment에도 길이 면제 없음. 유효 cM=0이면 cross-product 보정 통과 가능. | | i0,ρ>εs,c가 없음 | 가짜 c=0 통과 금지. zero residual 단독 통과 외에는 실제 correction 후 재평가. | | field pass 뒤 global equilibrium 실패 | accepted=0, flux/history commit 없음, 정상 final 교체 없음. | 문서 단계에서는 링크·source 식·분기·단위·transaction을 정적으로 검토한다. 빌드·solver 실행이나 과거 2024 결과에 대한 동등성 검증은 이 산출물의 evidence가 아니다.