docs: define HHT field convergence policy and branch contract
This commit is contained in:
@@ -1,7 +1,12 @@
|
||||
# Abaqus 수렴 허용치 조사와 FESA 대응
|
||||
|
||||
조사일: 2026-10-18. FESA 조사 기준: `43867d0`.
|
||||
상태: 문헌·코드 조사이며, 허용치 변경이나 성능 실험 결과가 아니다.
|
||||
상태: 문헌·코드 조사와 승인된 후보 정책의 수식 계약이다. 구현·성능 실험 통과 보고가 아니다.
|
||||
|
||||
승인된 후보의 시험 가능한 수식·분기 우선순위·평균 이력·로그 계약은
|
||||
[외부 field 수렴 정식화](formulation-convergence.md)를 따른다. 아래는 조사 당시 코드와
|
||||
공개 기본값의 비교이며, 후보 구현 완료를 뜻하지 않는다. 정식화는 2025 공개 STRICT
|
||||
규칙과 비공개 부분의 명시적 FESA 대응을 구분하며 실제 2024 설정과의 동일성을 주장하지 않는다.
|
||||
|
||||
## 조사 결론
|
||||
|
||||
@@ -13,7 +18,8 @@ Abaqus/Standard의 일반 비선형 평형 기준은 잔차 비율 **0.005**,
|
||||
|
||||
비선형 반복 종료, 선형방정식 풀이 정확도, 시간적분 정확도, 결과 비교 오차는 서로
|
||||
다른 기준이다. `1e-10`을 전역 검색해 `0.005`로 치환하는 접근은 부적절하다.
|
||||
이 문서에서의 적용 권고는 **실험 제안**이며 현재 승인된 FESA 판정을 대체하지 않는다.
|
||||
아래 적용 권고는 조사 당시 **실험 제안**이다. 이후 승인된 후보의 정확한 판정은
|
||||
정식화에 고정하며, 실제 구현·검증 상태와 구분한다.
|
||||
|
||||
## 출처와 버전의 한계
|
||||
|
||||
|
||||
@@ -20,6 +20,11 @@ MITC4 implicit dynamics의 외부 Newton 종료에 **Abaqus/Standard 2025의 공
|
||||
근거는 [조사 보고서](README.md)다. 2024 생성 INP의 실제 solver 설정 미확인은 별도 한계로
|
||||
기록하며, 그 로그가 없다는 이유로 2025 기준 후보 구현을 보류하지 않는다.
|
||||
|
||||
T1의 [외부 field 수렴 정식화](formulation-convergence.md)가 T3/T4의 수치·분기·로그 계약이다.
|
||||
요소 signed total과 source occurrence 개수, current trial 평균 후보와 accepted commit,
|
||||
보정/증분 chart, 비이차 검출의 명시적 FESA 대응 및 독립 oracle 경계를 이 문서에 고정했다.
|
||||
이는 수식 계약 완료이며 실제 후보 구현이나 정확도 검증 완료를 뜻하지 않는다.
|
||||
|
||||
공개 규칙을 FESA의 기존 물리량에 대응하는 실험이다. 잔차는 기존 full free endpoint
|
||||
E=I+fint-F, field는 병진 u와 total rotation-vector φ, 회전 flux는 generalized moment다.
|
||||
요소의 total internal+physical inertia flux와 외부 source contribution을 평균에 사용하고
|
||||
|
||||
@@ -0,0 +1,357 @@
|
||||
# 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 <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](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가 아니다.
|
||||
Reference in New Issue
Block a user