modify tolerance policy

This commit is contained in:
KOKO\Mimi
2026-08-18 02:29:26 +09:00
parent 123a1b6ccc
commit 624ea4872c
36 changed files with 1909 additions and 672 deletions
@@ -7,11 +7,15 @@
- status: `approved`
- approved_by: user
- approved_on: `2026-08-08`
- amended_on: `2026-08-09`
- amended_on: `2026-08-18`
- source_formulation: `docs/linear-static-3d-euler-beam/formulation.md`
- reference_baseline: `reference/cantilever beam/` from source commit `2b34d0b`
- reference_baseline: exact read-only artifacts under `reference/cantilever beam/`
- implementation_environment: C++17, MSVC, CMake, CTest, GoogleTest, Intel oneMKL, Intel oneTBB, HDF5
2026-08-18 amendment: the former node-station projection and mixed absolute-floor tolerance are
superseded by the direct element-endpoint identity and common family-scale row/RMS policy in
`2026-08-17-common-reference-tolerance-design.md` and ADR-022.
## 1. 목적
이 설계는 Abaqus `.inp` keyword subset을 읽어 2절점 3차원
@@ -288,8 +292,8 @@ node label 또는 node set이며 assembly-level set의 `INSTANCE` parameter를
Abaqus B31은 transverse shear deformation을 포함하는 Timoshenko beam이고 B33은
2절점 cubic EulerBernoulli beam이다. FESA V0는 `TYPE=B33`만 Euler 요소로 매핑한다.
`TYPE=B31``unsupported-element-formulation` 오류로 거부한다.
`reference/cantilever beam/cantilever beam.inp`source commit `2b34d0b`에서
`TYPE=B33`으로 생성된 승인 reference input이다. Reference artifact check는 비교 전에
`reference/cantilever beam/cantilever beam.inp``TYPE=B33`으로 생성된 승인 reference
input이다. Reference artifact check는 비교 전에
이 element type을 다시 확인하며 B31로 되돌아간 입력이나 결과를 허용하지 않는다.
이 결정은 [[Abaqus Structural Element Families]], [[Beam and Frame Finite Elements]],
@@ -370,19 +374,20 @@ Abaqus internal-force CSV는 equilibrium end action이 아니라 section resulta
| `SM1` | `MY` |
| `SM2` | `MZ` |
승인된 B33 reference의 `cantilever beam elemental forces.csv`element label 없이
`Frame`, `Part Instance Name`, `Node Label`, `SF1`, `SM1`, `SM2`, `SM3` 기록한다.
승인된 B33 reference의 `cantilever beam elemental forces.csv``Frame`,
`Part Instance Name`, `Element Label`, `Node Label`, `SF1`, `SM1`, `SM2`, `SM3`
기록한다.
따라서 이 파일의 comparison은 다음 규칙을 사용한다.
- Reference row key는 `(Step-1, frame 0, instance name, source node label, component)`다.
- Reference row key는 `(Step-1, frame 0, instance name, source element label,
endpoint source node label, component)`다.
단일 step invariant에 따라 CSV의 `Increment 1: Step Time = 1.000`을
`(Step-1, frame 0)`으로 정규화한다.
- FESA endpoint section resultant를 동일한 section-cut 부호로 변환한 뒤 source node
station으로 정규화한다. Interior node의 두 인접 element endpoint 값은 먼저 승인된
tolerance 안에서 서로 일치해야 한다. 불일치는 평균으로 숨기지 않고
`tolerance-failure`로 보고한다.
- Interior endpoint가 일치하면 stable internal element ID가 작은 endpoint를 대표 row로
선택한다. Boundary node는 하나의 endpoint를 사용한다.
- 각 B33 element에는 input connectivity의 두 source node label과 일치하는 endpoint row가
정확히 두 개 있어야 하며, 각 row를 해당 HDF5 element endpoint에 직접 대응한다.
Missing, extra, duplicate 또는 connectivity mismatch는 tolerance 전에 실패한다.
- Comparator는 같은 source node의 인접 endpoint를 node station으로 축약하거나 대표값을
선택하거나 평균하지 않는다.
- 이 bundle에서 비교하는 mapping은 `SF1 -> N`, `SM1 -> My`, `SM2 -> Mz`,
`SM3 -> T`다. CSV에 없는 `SF2`와 `SF3`는 reference comparison 대상이 아니며,
FESA equilibrium end action의 transverse force는 unit/analytical test와 physics sanity로
@@ -496,8 +501,8 @@ GoogleTest target에는 FESA warning policy를 강제하지 않는다.
- axial, torsion, y/z bending cantilever analytical cases
- HDF5 schema, identity, component, metadata, atomic finalization
- CLI `.inp -> results.h5` integration
- 승인된 B33 CSV header/Frame 정규화, node-station matching, interior endpoint 일치 검사
- zero 및 near-zero reference row를 포함한 component-scale 혼합 허용오차 검사
- 승인된 B33 CSV header/Frame 정규화와 element-endpoint direct identity 검사
- zero 및 near-zero reference row를 포함한 공통 family-scale 상대오차/RMS 검사
### 11.3 수치 tolerance
@@ -506,37 +511,33 @@ GoogleTest target에는 FESA warning policy를 강제하지 않는다.
| matrix symmetry and Gauss/closed-form comparison | normalized `1e-12` |
| rigid-mode and linear-system residual | normalized `1e-10` |
| analytical solution tests | relative `1e-9` |
| Abaqus B33 reference comparison | component-scale relative `1e-6` |
| SI displacement and rotation absolute floor | `1e-9` |
| SI force and moment absolute floor | `1e-3` |
| Abaqus reference row relative error | `0.05` |
| near-zero threshold ratio | reference family scale의 `0.01` |
| reference family scale-relative RMS | `0.01` |
Reference row 판정은 zero-reference에서도 의미가 있도록 component-scale 혼합
허용오차를 사용한다. 같은 model, step/frame, quantity, component의 Abaqus reference
rows에 대해 다음 값을 계산한다.
Reference row 판정은 같은 model, step/frame, quantity, component로 구성한 reference
family별 공통 규칙을 사용한다. Reference 값으로만 family scale을 계산한다.
```text
reference_scale = max(abs(reference_value_i))
row_tolerance = absolute_floor + 1e-6 * reference_scale
row_pass = abs(fesa_value_i - reference_value_i) <= row_tolerance
S = max(abs(reference_value_i))
near_zero_i = abs(reference_value_i) <= 0.01 * S
row_pass_i = abs(fesa_value_i - reference_value_i) / abs(reference_value_i) <= 0.05
if not near_zero_i
row_pass_i = abs(fesa_value_i - reference_value_i) <= 0.01 * S
if near_zero_i
relative_rms = sqrt(mean((fesa_value_i - reference_value_i)^2)) / S
family_pass = all(row_pass_i) and relative_rms <= 0.01
```
- Scale은 displacement, rotation, force, moment 및 각 component를 섞지 않는다.
- Family는 displacement, rotation, force, moment 및 각 component를 섞지 않는다.
- Scale은 read-only Abaqus reference 값만 사용하며 FESA 결과로 조정하지 않는다.
- Scale이 0이면 absolute floor만 적용한다.
- `S == 0`이면 모든 FESA 값이 정확히 0일 때만 통과한다. 하나라도 0이 아니면
`zero-reference-scale-nonzero-error`로 실패한다.
- 모든 row를 개별 판정하며 reference 값을 zero-clamp하거나 row를 제거하지 않는다.
- Missing/extra row, nonfinite value, schema 또는 identity mismatch는 tolerance 계산 전에
실패한다.
- Report는 max absolute error, component-scale normalized error, RMS error, norm error,
worst row/component를 기록한다.
현재 B33 `SM1`의 reference scale은 `1.0e7`이고 moment row tolerance는
`1.0e-3 + 1.0e-6 * 1.0e7 = 10.001`이다. 자유단 reference residue `-1.56e-2`
FESA의 이론적 zero 사이 오차 `1.56e-2`는 이 기준을 통과하지만, 예를 들어 `100`
자유단 moment 오차는 실패한다.
승인된 cantilever bundle은 SI absolute floor를 사용한다. 이후 SI가 아닌 reference를
추가하면 quantity별 absolute floor를 해당 단위로 변환하고 변환 근거를 metadata와
verification report에 기록해야 한다.
- Report는 family scale, max absolute error, max row relative error, scale-relative RMS,
worst row/component와 판정 reason을 기록한다. 독립적인 absolute-error gate는 없다.
### 11.4 공통 build/test command
@@ -561,9 +562,10 @@ CTest discovery 결과는 한 개 이상의 test를 포함해야 한다.
## 12. Reference 및 release gate
`reference/cantilever beam/`을 V0의 승인된 Abaqus B33 reference baseline으로 사용한다.
논리 model ID는 `cantilever-beam-b33`, reference schema ID는
`abaqus-cae-report-csv-v0`이며 source baseline은 commit `2b34d0b`이다. Input header가
기록한 generator는 `Abaqus/CAE Learning Edition 2024`다. 모델은 SI 단위계, global
논리 model ID는 `cantilever-beam-b33`이다. 기존 `abaqus-cae-report-csv-v0`과 source
commit `2b34d0b` 기록은 2026-08-09 당시 inventory의 역사적 provenance이며, 2026-08-18
regenerated elemental-force CSV의 현재 readiness gate가 아니다. Input header가 기록한
generator는 `Abaqus/CAE Learning Edition 2024`다. 모델은 SI 단위계, global
Cartesian nodal output, beam local section-force output, `Step-1`, increment 1,
step time 1.0 계약으로 해석한다.
@@ -588,8 +590,8 @@ Reference verification은 build/test gate 통과 후 승인 input으로 FESA `re
- nodal displacement: CSV `U1/U2/U3/UR1/UR2/UR3`과 HDF5 displacement
- nodal reaction: CSV `RF1/RF2/RF3/RM1/RM2/RM3`과 HDF5 reaction
- section resultant: CSV `SF1/SM1/SM2/SM3`과 node station으로 정규화한 HDF5
section resultant
- section resultant: CSV `SF1/SM1/SM2/SM3`과 element label 및 endpoint node label로
직접 대응한 HDF5 section resultant
- stress: 명시적 N/A
Artifact check는 네 파일의 존재, B33 element type, expected header, 유일한 row key,
@@ -3,11 +3,16 @@
## Status
- date: `2026-08-12`
- amended_on: `2026-08-18`
- status: `approved`
- scope: FESA project policy, agents, skills, and `linear-static-mitc4-shell` upstream contracts
- implementation_code: out of scope
- reference_artifact_mutation: prohibited
2026-08-18 amendment: the former MITC4 fixed absolute tolerance is superseded by the common
family-scale row/RMS policy in `2026-08-17-common-reference-tolerance-design.md` and ADR-022.
The independent-solver, minimal-reference-case and drilling decisions remain unchanged.
## Decision
FESA is an independent finite element solver. It accepts an approved subset of the
@@ -84,19 +89,23 @@ Only matched global `U1/U2/U3` rows are blocking. `UR1/UR2/UR3` rows are compare
reported as warning-only evidence. Reactions and stresses may be inspected but are not
reference pass/fail quantities.
For every matched U/UR row:
The project-wide common policy now evaluates each matched U/UR component family:
```text
tolerance = 1.0e-5
S = max(abs(reference_value_i))
near_zero_i = abs(reference_value_i) <= 0.01 * S
ordinary_row_pass_i = abs(error_i) / abs(reference_value_i) <= 0.05
near_zero_row_pass_i = abs(error_i) <= 0.01 * S
relative_rms = sqrt(mean(error_i^2)) / S <= 0.01
```
The fixed value is expressed in the model's user-consistent length unit for translation
and as a dimensionless rotation value for warning-only UR. Reference scale may remain
diagnostic report data but does not enter the tolerance or normalized-error denominator.
Values are not zero-clamped. Missing, duplicate, unmatched, or nonfinite required rows
fail before numeric tolerance evaluation. U tolerance failure fails reference
verification; UR tolerance exceedance emits a deterministic warning only. The B33 mixed
tolerance remains unchanged.
The scale is computed from read-only reference values in the same model, step/frame,
quantity and component family. If `S == 0`, only exact-zero FESA values pass; otherwise
the reason is `zero-reference-scale-nonzero-error`. There is no independent absolute-error
gate. Values are not zero-clamped. Missing, duplicate, unmatched, or nonfinite required
rows fail before numeric tolerance evaluation. U tolerance failure fails reference
verification; UR tolerance exceedance emits a deterministic warning only. B33 uses the
same row and family-RMS thresholds.
No additional locking, convergence, distorted, curved, director-angle, or invalid
geometry reference portfolio is required for this MITC4 implementation acceptance.
@@ -147,7 +156,7 @@ For MITC4:
- fixed drilling stabilization closes `NR-O01` and removes `NR-O02` by scope;
- `NR-O03` and `NR-O04` are removed from the approved verification scope;
- the fixed absolute MITC4 tolerance `1.0e-5` closes the blocking part of `NR-O05`;
- the common family-scale row/RMS policy closes the blocking part of `NR-O05`;
- missing heavyweight reference metadata is `not-required-by-policy`;
- confirmed formulation defects remain blocking.
@@ -3,11 +3,15 @@
## Status
- date: `2026-08-17`
- status: `approved-design-pending-implementation`
- status: `implemented-and-verified`
- verified_on: `2026-08-18`
- scope: 모든 FESA 외부 reference comparison
- production_solver_behavior: 변경 없음
- reference_artifact_mutation: 금지
현재 운영 상수, 검증 순서, report schema와 변경 관리는 `docs/TOLERANCE.md`를 source of
truth로 사용한다. 이 문서는 승인 결정의 설계 근거와 대안 검토를 보존한다.
## 목적
B33, MITC4 및 이후 추가되는 기능이 서로 다른 수치 tolerance 식을 만들지 않도록 공통
@@ -67,6 +71,26 @@ S_g = \max_{i \in g}|R_i|
dimension, components 및 behavior를 명시해 family에 배치한다. 물리 차원이 같다는 이유만으로
서로 다른 logical quantity를 자동으로 합치지 않는다.
### B33 element-endpoint identity amendment
2026-08-18에 사용자가 다시 생성한
`reference/cantilever beam/cantilever beam elemental forces.csv``Element Label`
`Node Label`을 모두 포함하고 B33 요소마다 두 endpoint 행을 제공한다. Section-resultant
comparison은 다음 key로 각 CSV 행을 HDF5 `[element, endpoint, component]` 행에 직접
대응시킨다.
```text
(model_id, step/frame, instance_name, source_element_label,
source_node_label, quantity, component)
```
Component mapping은 `SF-SF1 -> N`, `SM-SM1 -> My`, `SM-SM2 -> Mz`,
`SM-SM3 -> T`다. Comparator는 이 CSV를 source-node station으로 collapse하거나 인접
endpoint를 평균하지 않는다. Missing, extra, duplicate 또는 connectivity-mismatched
element-endpoint identity는 tolerance 전에 실패한다. Production
`ResultRecovery::NormalizeSectionResultantsToNodeStations` 계약과 그 단위 테스트는 이 외부
reference identity 변경의 범위가 아니다.
## 행별 판정
각 대응 행에 대해 다음 absolute error를 계산한다.
@@ -149,15 +173,16 @@ Comparator report는 최소한 다음 항목을 보존한다.
## 현재 B33/MITC4 Evidence
기존 solver를 재실행하거나 reference artifact를 수정하지 않고 다음 생성 ledger의 원본
FESA/reference 값을 새 규칙으로 재계산했다.
MSVC Debug build와 214개 CTest를 통과한 현재 comparator가 다음 ledger를 생성했다.
Reference artifact는 수정하지 않았으며 B33은 regenerated 20-row element-endpoint identity를
직접 비교한다.
- `.harness/build/reference/cantilever-beam-b33/comparison.json`
- `.harness/build/reference/mitc4-shell-s4-comparison/comparison.json`
| case | row gate | maximum family relative RMS | RMS gate | verdict |
| --- | --- | ---: | --- | --- |
| B33 | 모든 blocking 행 통과 | 약 `1.17e-8` | 통과 | 통과 |
| B33 direct endpoint | 모든 212 blocking 행 통과 | 약 `1.17e-8` | 통과 | 통과 |
| MITC4 U | 모든 blocking 행 통과 | 약 `1.03e-3` | 통과 | 통과 |
| MITC4 UR | 모든 warning-only 행 통과 | 약 `2.98e-3` | 통과 | warning 없음 |