22 KiB
MITC4 HHT 외부 field 수렴 정식화
작성일: 2026-10-18. 코드 대조 revision: d7f6d0c.
정책 ID: abaqus2025-field-on-fesa-v1. 상태: 구현 계약이며 구현·수치 통과 보고가 아니다.
적용 범위와 근거
이 문서는 적용 계획의 T1 산출물이다. 양의 증분의
nodal-lumped-kinetic / reduced-coordinate / fixed-null MITC4 HHT 외부 Newton 종료만
교체한다. 통상 fesa.exe <input> 경로가 이 후보를 실제 사용해야 한다. 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: field 제어와 반복 제어의 구분 및 IP.
- S2 *CONTROLS: STRICT 기본 모드와 FIELD 두 데이터 줄.
- S3 Convergence Criteria for Nonlinear Problems: 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 잔차를 그대로 쓴다.
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)를 사용한다.
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는 초기 shell의 네 edge 길이 중 모델 최대 L을 계산하고 유한 양수인지 검사한다. L을 아래 차원 변환과 미소 병진 예외에 그대로 사용한다. Abaqus 내부 특성길이와 같다고 가정하지 않는다. 단위계 변환 때 L·힘·모멘트가 함께 변환되어야 한다.
공간 평균: 조립 전 signed total과 source 개수
같은 trial의 각 요소 e, local node a, field component k에서 다음 scalar occurrence를 만든다.
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 값으로 바꾸지 않는다.
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 이력으로 다음 후보를 다시 만든다.
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 이력은 다음과 같다.
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를 독립 계산하고 다음 치환을 동시에 한 번만 한다.
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에서 원래 ρα다.
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 검출식이다.
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를 구한 뒤 다음 순서로 평가한다.
- i>=1이고 모든 활성 field가 ν<=Rl이면 전부
linear: residual_pass=1, correction_pass=not-evaluated, field_pass=1. i=0에서는 한 번도 Newton correction을 하지 않았으므로 linear 면제를 쓰지 않는다. - 남은 경우 각 field에서 z가 true이면
zero-flux: residual_pass=(ν<=ε). 통과하면 correction은 미평가이고 field_pass=1. 아니면 유효 실제 c에 대해 correction_pass=(c<=Cε*D), field_pass=correction_pass다. OR 규칙이며 Cn·Rp·추정 보정을 섞지 않는다. - z=false이고 nonquadratic 검출이 true이면
nonquadratic: residual_pass=(ν<=Rp), correction_pass=(유효 실제 c<=Cn*D), field_pass=두 pass의 AND다. 이 분기에는 cest를 사용하지 않는다. - 나머지는
normal: residual_pass=(ν<=Rn), correction_pass=(유효 실제 c<=CnD OR 유효 cest<=CnD), field_pass=두 pass의 AND다.
S3의 미소 병진 예외는 normal/nonquadratic의 Cn 보정 요구에만 적용한다. force field에서 D<εdL이면 correction_pass=not-evaluated로 면제하고, field_pass=residual_pass다. D=εdL에서는 면제가 아니다. 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 / 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 / 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 | 실제 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이다.
기본 키는 다음 순서다.
record schema policy_id step increment time iteration stage outcome failure_code field_pass accepted
뒤이어 force_,moment_ 각각 아래 suffix 순서로 기록한다.
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가 아니다.