docs: use B33 cantilever reference baseline
This commit is contained in:
@@ -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 Euler–Bernoulli beam이다. FESA V0는 `TYPE=B33`만 Euler 요소로 매핑한다.
|
2절점 cubic Euler–Bernoulli 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한다.
|
||||||
|
|||||||
Reference in New Issue
Block a user