docs: use B33 cantilever reference baseline

This commit is contained in:
KOKO\Mimi
2026-08-09 00:06:36 +09:00
parent 3a1449c5e0
commit 94cd4b9b83
@@ -7,7 +7,9 @@
- status: `approved` - status: `approved`
- approved_by: user - approved_by: user
- approved_on: `2026-08-08` - approved_on: `2026-08-08`
- amended_on: `2026-08-09`
- source_formulation: `docs/formulations/3d-isoparametric-euler-beam-formulation.md` - source_formulation: `docs/formulations/3d-isoparametric-euler-beam-formulation.md`
- reference_baseline: `reference/cantilever beam/` from source commit `2b34d0b`
- implementation_environment: C++17, MSVC, CMake, CTest, GoogleTest, Intel oneMKL, Intel oneTBB, HDF5 - implementation_environment: C++17, MSVC, CMake, CTest, GoogleTest, Intel oneMKL, Intel oneTBB, HDF5
## 1. 목적 ## 1. 목적
@@ -50,7 +52,7 @@ authoritative HDF5 파일 `results.h5`에 기록하는 FESA V0 파이프라인
- MKL PARDISO factorization과 substitution의 분리 - MKL PARDISO factorization과 substitution의 분리
- oneTBB 기반 element-local 계산 - oneTBB 기반 element-local 계산
- 변위, 반력, equilibrium end action, section resultant, axial `S11` 출력 - 변위, 반력, equilibrium end action, section resultant, axial `S11` 출력
- Abaqus B33 변위·반력·section resultant reference comparison - 승인된 `reference/cantilever beam/` B33 bundle의 변위·반력·section resultant comparison
### 2.2 제외 범위 ### 2.2 제외 범위
@@ -285,8 +287,10 @@ node label 또는 node set이며 assembly-level set의 `INSTANCE` parameter를
Abaqus B31은 transverse shear deformation을 포함하는 Timoshenko beam이고 B33은 Abaqus B31은 transverse shear deformation을 포함하는 Timoshenko beam이고 B33은
2절점 cubic EulerBernoulli beam이다. FESA V0는 `TYPE=B33`만 Euler 요소로 매핑한다. 2절점 cubic EulerBernoulli beam이다. FESA V0는 `TYPE=B33`만 Euler 요소로 매핑한다.
`TYPE=B31``unsupported-element-formulation` 오류로 거부한다. 기존 B31 reference `TYPE=B31``unsupported-element-formulation` 오류로 거부한다.
결과를 tolerance 확대로 Euler reference인 것처럼 사용하지 않는다. `reference/cantilever beam/cantilever beam.inp`는 source commit `2b34d0b`에서
`TYPE=B33`으로 생성된 승인 reference input이다. Reference artifact check는 비교 전에
이 element type을 다시 확인하며 B31로 되돌아간 입력이나 결과를 허용하지 않는다.
이 결정은 [[Abaqus Structural Element Families]], [[Beam and Frame Finite Elements]], 이 결정은 [[Abaqus Structural Element Families]], [[Beam and Frame Finite Elements]],
[[Abaqus-Analysis-User-s-Guide-Volume-IV|Abaqus Analysis User's Guide Volume IV]]의 [[Abaqus-Analysis-User-s-Guide-Volume-IV|Abaqus Analysis User's Guide Volume IV]]의
@@ -355,7 +359,7 @@ beam-family 구분을 따른다.
- generalized strain/resultant: 두 Gauss point의 formulation 값 - generalized strain/resultant: 두 Gauss point의 formulation 값
Abaqus internal-force CSV는 equilibrium end action이 아니라 section resultant와 Abaqus internal-force CSV는 equilibrium end action이 아니라 section resultant와
비교한다. component mapping은 다음과 같다. 비교한다. 일반 component mapping은 다음과 같다.
| Abaqus | FESA local component | | Abaqus | FESA local component |
| --- | --- | | --- | --- |
@@ -366,6 +370,24 @@ Abaqus internal-force CSV는 equilibrium end action이 아니라 section resulta
| `SM1` | `MY` | | `SM1` | `MY` |
| `SM2` | `MZ` | | `SM2` | `MZ` |
승인된 B33 reference의 `cantilever beam elemental forces.csv`는 element label 없이
`Frame`, `Part Instance Name`, `Node Label`, `SF1`, `SM1`, `SM2`, `SM3`을 기록한다.
따라서 이 파일의 comparison은 다음 규칙을 사용한다.
- Reference row key는 `(Step-1, frame 0, instance name, 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를 사용한다.
- 이 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로
검증한다.
### 8.3 Axial stress ### 8.3 Axial stress
General beam section은 section point에서 axial stress만 복구한다. General beam section은 section point에서 axial stress만 복구한다.
@@ -405,9 +427,11 @@ coordinate convention, element formulation을 기록한다. Node/element group
ID와 instance/source label mapping을 함께 저장한다. ID와 instance/source label mapping을 함께 저장한다.
Abaqus `.inp` 자체에는 단위 선언이 없으므로 일반 solver run의 unit-system label은 Abaqus `.inp` 자체에는 단위 선언이 없으므로 일반 solver run의 unit-system label은
`user-consistent-unspecified`로 기록한다. Reference comparison에서는 별도 `user-consistent-unspecified`로 기록하고 solver가 입력 파일만 보고 SI를 추론하지
`metadata.json`이 선언한 단위계를 authoritative unit label로 사용하며, solver가 입력 않는다. 승인된 cantilever B33 reference에 한해서는 이 설계와 후속 Reference Model
파일만 보고 SI를 추론하지 않는다. Contract가 입력 수치의 단위계를 SI로 선언하고, reference verification이 동일한 입력으로
생성된 FESA 결과에 그 외부 단위 계약을 적용한다. 새 reference model은 별도
`metadata.json`에 단위계를 선언해야 한다.
- displacement: `[node_count, 6]` - displacement: `[node_count, 6]`
- reaction: `[node_count, 6]` - reaction: `[node_count, 6]`
@@ -471,6 +495,8 @@ GoogleTest target에는 FESA warning policy를 강제하지 않는다.
- axial, torsion, y/z bending cantilever analytical cases - axial, torsion, y/z bending cantilever analytical cases
- HDF5 schema, identity, component, metadata, atomic finalization - HDF5 schema, identity, component, metadata, atomic finalization
- CLI `.inp -> results.h5` integration - CLI `.inp -> results.h5` integration
- 승인된 B33 CSV header/Frame 정규화, node-station matching, interior endpoint 일치 검사
- zero 및 near-zero reference row를 포함한 component-scale 혼합 허용오차 검사
### 11.3 수치 tolerance ### 11.3 수치 tolerance
@@ -479,13 +505,37 @@ GoogleTest target에는 FESA warning policy를 강제하지 않는다.
| matrix symmetry and Gauss/closed-form comparison | normalized `1e-12` | | matrix symmetry and Gauss/closed-form comparison | normalized `1e-12` |
| rigid-mode and linear-system residual | normalized `1e-10` | | rigid-mode and linear-system residual | normalized `1e-10` |
| analytical solution tests | relative `1e-9` | | analytical solution tests | relative `1e-9` |
| Abaqus B33 reference comparison | relative `1e-6` | | Abaqus B33 reference comparison | component-scale relative `1e-6` |
| SI displacement and rotation absolute floor | `1e-9` | | SI displacement and rotation absolute floor | `1e-9` |
| SI force and moment absolute floor | `1e-3` | | SI force and moment absolute floor | `1e-3` |
Reference row 판정은 `abs_error <= abs_tol OR rel_error <= rel_tol`을 사용한다. Reference row 판정은 zero-reference에서도 의미가 있도록 component-scale 혼합
Reference metadata가 SI가 아니면 quantity별 absolute tolerance를 동일 차원으로 변환해야 허용오차를 사용한다. 같은 model, step/frame, quantity, component의 Abaqus reference
하며 변환 근거를 verification report에 기록한다. rows에 대해 다음 값을 계산한다.
```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
```
- Scale은 displacement, rotation, force, moment 및 각 component를 섞지 않는다.
- Scale은 read-only Abaqus reference 값만 사용하며 FESA 결과로 조정하지 않는다.
- Scale이 0이면 absolute floor만 적용한다.
- 모든 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에 기록해야 한다.
### 11.4 공통 build/test command ### 11.4 공통 build/test command
@@ -509,21 +559,43 @@ CTest discovery 결과는 한 개 이상의 test를 포함해야 한다.
## 12. Reference 및 release gate ## 12. Reference 및 release gate
기존 `reference/cantilever beam/` bundle은 Abaqus B31 결과이므로 수정하지 않고 V0 `reference/cantilever beam/`을 V0의 승인된 Abaqus B33 reference baseline으로 사용한다.
Euler verification에 사용하지 않는다. Reference Model Contract는 사람이 Abaqus에서 논리 model ID는 `cantilever-beam-b33`, reference schema ID는
생성할 B33 bundle의 다음 artifact를 요구한다. `abaqus-cae-report-csv-v0`이며 source baseline은 commit `2b34d0b`이다. 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 계약으로 해석한다.
- `model.inp` using `TYPE=B33` | Purpose | Approved artifact |
- `metadata.json` with Abaqus version, units, coordinate system, provenance, tolerances | --- | --- |
- `<model-id>_displacements.csv` | analysis input | `reference/cantilever beam/cantilever beam.inp` |
- `<model-id>_reactions.csv` | displacement | `reference/cantilever beam/cantilever beam displacements.csv` |
- `<model-id>_internalforces.csv` | reaction | `reference/cantilever beam/cantilever beam reactions.csv` |
- `README.md` | section resultant | `reference/cantilever beam/cantilever beam elemental forces.csv` |
- stress CSV: explicitly `not-applicable` for this feature | stress | N/A: beam stress reference comparison은 승인 범위에서 제외 |
이 기존 bundle의 space-containing filename과 CAE report header는 승인된 legacy alias로
그대로 지원하며 reference artifact를 rename하거나 rewrite하지 않는다. `metadata.json`
`README.md`는 이 baseline에 한해서 N/A다. 이 설계와 Step 5의 Reference Model Contract가
대신 model ID, provenance, units, coordinate system, schema, file inventory, tolerance와
stress N/A 사유를 기록한다. 이후 추가하는 reference model에는 canonical artifact 이름,
`metadata.json`, `README.md`를 요구한다.
Reference verification은 build/test gate 통과 후 승인 input으로 FESA `results.h5`
생성하고 다음을 직접 비교한다.
- 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
- stress: 명시적 N/A
Artifact check는 네 파일의 존재, B33 element type, expected header, 유일한 row key,
finite value를 확인한다. 하나라도 충족하지 않으면 `needs-reference-artifacts` 또는
`schema-mismatch`로 분류하고 comparison을 시작하지 않는다. 현재 baseline은
`metadata.json` 또는 `README.md` 부재만으로 차단하지 않는다.
Agent와 Harness는 Abaqus를 실행하거나 reference artifact를 생성·수정하지 않는다. Agent와 Harness는 Abaqus를 실행하거나 reference artifact를 생성·수정하지 않는다.
B33 artifact가 없으면 reference-verification step은 `blocked`로 끝나며 사용자가 bundle을
준비한 후 해당 step을 `pending`으로 되돌려 재개한다.
Reference comparison이 pass한 뒤에만 physics sanity를 수행한다. Physics sanity는 Reference comparison이 pass한 뒤에만 physics sanity를 수행한다. Physics sanity는
global force/moment equilibrium, reaction sign, displacement direction, symmetry, element global force/moment equilibrium, reaction sign, displacement direction, symmetry, element
@@ -539,7 +611,8 @@ gate evidence와 known limitations를 확인한다.
2. 모든 production C++ 변경에 대응 테스트와 RED/GREEN/VERIFY evidence가 있다. 2. 모든 production C++ 변경에 대응 테스트와 RED/GREEN/VERIFY evidence가 있다.
3. MSVC x64 Debug configure, build, CTest discovery, 전체 CTest가 성공한다. 3. MSVC x64 Debug configure, build, CTest discovery, 전체 CTest가 성공한다.
4. `fesa.exe`가 승인된 B33 single-step input에서 `results.h5`를 생성한다. 4. `fesa.exe`가 승인된 B33 single-step input에서 `results.h5`를 생성한다.
5. HDF5 변위·반력·내력 rows가 Abaqus B33 reference CSV와 tolerance 안에서 일치한다. 5. HDF5 변위·반력·내력 rows가 승인된 cantilever B33 reference CSV와 component-scale
혼합 tolerance 안에서 일치한다.
6. Beam stress reference comparison은 명시적 N/A이고 stress output schema/test는 6. Beam stress reference comparison은 명시적 N/A이고 stress output schema/test는
통과한다. 통과한다.
7. Physics sanity가 pass한다. 7. Physics sanity가 pass한다.