# PRD: FESA

## 1. 제품 목표

FESA는 Abaqus `.inp` 제한 부분집합으로 정의된 유한요소 모델을 읽고 선형 정적
구조해석을 수행한 뒤, 모델과 절점·요소 결과를 자기완결형 HDF5 파일로 저장하는
C++20/MSVC 기반 내부 검증용 솔버다.

첫 배포는 Abaqus나 Nastran의 기능 범위를 재현하는 것이 아니라 다음 기반을 검증하는
데 목적이 있다.

- 입력에서 결과까지 이어지는 전체 해석 파이프라인
- FEM 정식화를 추적할 수 있는 모듈 구조
- 명시적인 입력·내부 모델·출력 계약
- MKL, TBB 및 HDF5를 격리하는 backend 경계
- 해석해, physics sanity 및 reference 비교가 가능한 TDD 구조

## 2. 대상 사용자와 배포 형태

- 주 사용자: FESA를 개발하고 검증하는 1인 개발자
- 배포 대상: 개발팀 내부 검증 환경
- 산출물: 정적 해석 코어 라이브러리, CLI, 예제 입력, HDF5 schema 문서,
  reference 데이터 및 검증 보고서
- 일정: 고정 기한보다 단계별 완료 조건과 품질 게이트를 우선한다.

## 3. Phase 1 기능 범위

### 3.1 해석

- 소변형 선형 정적 해석
- 단일 `*STEP`과 단일 `*STATIC` 하중 케이스
- 약 10만 자유도 이하
- 비영 지정 변위·회전을 포함한 essential boundary condition
- 일관 단위계 사용; FESA 내부 단위 변환 없음

### 3.2 요소와 정식화

- 2절점 직선 3D Isoparametric Timoshenko Beam
- 절점당 자유도:
  \(u_x,u_y,u_z,\theta_x,\theta_y,\theta_z\)
- 선형 형상함수와 자연좌표 \(\xi\in[-1,1]\)
- 선택적 감차적분:
  - 축·굽힘·비틀림 항: 2점 Gauss 적분
  - 전단 항: 1점 Gauss 적분
- 등방성 선형 탄성:
  - 입력: \(E,\nu\)
  - 계산: \(G=E/[2(1+\nu)]\)
- 일반 단면 semantic property:
  \(A,I_y,I_z,J,A_{sy},A_{sz}\)
- 도심과 전단중심이 일치하는 주축 단면
- \(I_{yz}=0\), 단면 오프셋과 워핑 없음
- 요소축과 평행하지 않은 국부 단면 기준 방향 벡터 필수
- 여러 재료와 여러 단면을 `ELSET`별로 할당

### 3.3 Abaqus 입력 부분집합

입력은 다음 두 조직 중 하나를 사용한다.

- 전역 절점·요소로 구성된 flat/orphan mesh
- 여러 Part 정의와 좌표변환이 없는 단일 Assembly·단일 Instance

계층형 입력에서는 Assembly의 Instance가 참조하는 Part만 해석에 사용한다. 사용되지
않는 Part는 파싱하지만 해석 `Domain`에 포함하지 않는다. 외부 entity는
`(instance name, part-local label)`로 식별하고 내부 dense index와 분리한다.

필수 지원 대상:

- `*NODE`
- `*ELEMENT, TYPE=B31`
- `*PART`, `*END PART`
- `*ASSEMBLY`, `*END ASSEMBLY`
- `*INSTANCE`, `*END INSTANCE`
- `*NSET`, `*ELSET`
  - 명시적 ID 목록
  - `GENERATE`
  - 기존 집합을 참조하는 중첩 집합
- `*MATERIAL`, `*ELASTIC`
- `*BEAM GENERAL SECTION, SECTION=GENERAL`
- `*TRANSVERSE SHEAR STIFFNESS`(선택)
- `*BOUNDARY`
- `*CLOAD`
- `*STEP`, `*STATIC`, `*END STEP`

계층형 입력은 좌표변환이 없는 단일 Instance만 허용한다. 여러 Assembly/Instance,
Instance 평행이동·회전, instance-local mesh 수정 및 flat/계층 mesh 혼합은 파일
위치와 원인을 포함한 diagnostic으로 거부한다. Part 집합과 Assembly 집합은 scope를
구분하며, Assembly의 `INSTANCE=` 집합을 활성 Part의 로컬 ID에 연결한다.

파서는 Abaqus syntax를 semantic model로 변환한다. `*HEADING`, `*PREPRINT`,
`*RESTART`, `*OUTPUT`은 명시적으로 지원하는 no-op directive로 처리한다. 그 밖의
지원하지 않는 keyword나 option을 묵시적으로 무시하지 않는다.

명시적 전단강성이 있으면 FESA의 \(A_{sy},A_{sz}\)를 재료의 \(G\)와 일관되게
구성한다. 생략되면 \(A_{sy}=A_{sz}=5A/6\)과 `SCF=0`을 Phase 1 기본값으로
적용한다. 명시된 `SCF`가 0이 아니면 미지원 입력으로 거부한다.

### 3.4 하중과 경계조건

- `*BOUNDARY`: 6개 절점 자유도의 0 또는 비영 지정값
- `*CLOAD`: 절점 집중력과 집중모멘트
- 지정값이 중복되거나 충돌하면 semantic validation 오류
- 분포하중, 중력, 압력 및 follower load는 제외

### 3.5 결과

절점 결과는 전역좌표계로 출력한다.

- 변위와 회전
- 반력과 반력모멘트

요소 결과는 요소 국부좌표계로 출력한다.

- 단면력 \(N,V_y,V_z,T,M_y,M_z\)
- 대응 단면변형률
- 사용자 지정 단면 회복점 \((y,z)\)에서 축력과 이축 굽힘에 의한
  \(\sigma_{xx}\)
- 요소별 국부 기저 벡터
- 계층형 입력의 Part/Instance 이름과 part-local ID

점별 전단응력과 비틀림응력은 단면 형상 정보 없이는 유일하게 복원할 수 없으므로
Phase 1에서 출력하지 않는다.

HDF5 결과는 다음 정보를 함께 갖는 자기완결형 파일이어야 한다.

- schema와 FESA 버전
- 원본 입력 식별 정보
- 절점, 요소, 집합, 재료 및 단면
- 외부 ID와 내부 dense index mapping
- step과 solver 설정
- 적용된 전단강성과 입력값/기본값 출처
- 절점·요소 결과
- 수렴·평형·solver diagnostic

## 4. 수치해법과 병렬화 요구사항

- 지정 자유도 소거 후 reduced equation system을 구성한다.
- 소거 전 평형식 \(r=Ku-f\)를 이용해 반력을 복원한다.
- 전역 강성행렬은 대칭 CSR로 저장한다.
- MKL PARDISO 대칭 양정치 직접해법을 기본 backend로 사용한다.
- oneTBB는 요소 강성·하중·결과 계산과 조립 전처리에 사용한다.
- 선형해법 실행 중에는 외부 TBB 작업을 중첩하지 않고 MKL 내부 병렬화를 사용한다.
- 부동소수점 contribution의 병합 순서를 고정해 같은 설정에서 재현 가능한 결과를 낸다.

## 5. 검증 요구사항

### 5.1 검증 계층

1. 단위 테스트
   - 형상함수 partition of unity
   - Jacobian과 Gauss 적분
   - 국부 기저 직교성
   - 좌표변환
   - 요소 강성 대칭성
2. 정식화 테스트
   - 강체운동에서 무변형
   - 축력, 비틀림, 단축 및 이축 굽힘
   - 전단 지배 문제
   - 세장비 변화와 shear locking
3. 통합 테스트
   - 입력 파싱부터 HDF5 출력까지 전체 파이프라인
   - 평형 \(Ku-f-r\)
   - 비영 지정 변위
   - 여러 재료·단면과 중첩 집합
4. Reference 테스트
   - Abaqus/Standard 2024 B31 결과
   - 현재 캔틸레버의 변위와 반력
   - 요소 내력 및 요소 절점 단면 도심 응력 비교 계약의 synthetic CSV 검증

### 5.2 골든 데이터

Abaqus는 CI나 Harness에서 자동 실행하지 않는다. 별도 Abaqus 2024 환경에서 수동으로
생성한 입력과 CSV 결과를 `reference/<model-id>/`에 보관하며 per-model metadata
파일은 요구하지 않는다.

비교 실행은 물리량과 해당 CSV 경로를 명시한다. 요청한 파일이 없으면 실패하고,
요청하지 않은 물리량은 통과로 보고하지 않는다. 현재 `reference/cantilever beam`
샘플은 변위와 반력만 비교한다. 요소 내력과 응력 CSV가 추가되기 전까지 해당
reader와 비교 kernel은 synthetic CSV로 검증한다.

CSV 식별 및 값 열:

- 변위: `Part Instance Name`, `Node Label`, `U-U1..U-U3`, `UR-UR1..UR-UR3`
- 반력: `Part Instance Name`, `Node Label`, `RF-RF1..RF-RF3`, `RM-RM1..RM-RM3`
- 요소 내력: `Part Instance Name`, `Element Label`, `Node Label`,
  `SF-SF1..SF-SF3`, `SM-SM1..SM-SM3`
- 요소 응력: `Part Instance Name`, `Element Label`, `Node Label`, `Sxx`

단일 Instance에서는 `Part Instance Name` 열을 생략할 수 있다. 내력은
`SF1,SF2,SF3,SM1,SM2,SM3`을 각각 \(N,V_y,V_z,T,M_y,M_z\)로 비교한다.
응력은 요소 절점의 단면 도심값 \(\sigma_{xx}=N/A\)를 비교한다.

### 5.3 허용오차

- 단위·정식화 테스트는 정규화된 엄격한 tolerance를 사용한다.
- Abaqus 비교 기본 상대오차는 \(10^{-5}\)로 한다.
- 영에 가까운 결과는 특성 길이, 하중 및 응력에 기반한 절대오차를 함께 사용한다.
- formulation 또는 output 위치 차이로 별도 tolerance가 필요하면 comparison
  test 설정과 `docs/VALIDATION.md`에 근거를 기록한다.

## 6. 개발 워크플로우

각 기능은 다음 게이트를 순서대로 통과한다.

1. 요구조건과 완료 기준 정의
2. 책, 논문 및 공식 문서 조사
3. FEM 정식화, 가정, 좌표계, 부호 및 적분 규칙 작성
4. 입력·semantic model·HDF5 데이터 계약 정의
5. 실패하는 테스트와 개발 솔버/Abaqus 모델 작성
6. 테스트를 통과하는 최소 코드 구현
7. 현재 Abaqus 변위·반력 비교와 요소 내력·응력 비교 루틴 검증
8. tolerance 및 physics sanity 통과
9. 내부 배포

파이프라인 수직 슬라이스를 먼저 완성하지만, 이는 수치적으로 자격이 검증된 배포를
의미하지 않는다. 요소 정확도와 Abaqus 비교 게이트까지 통과해야 Phase 1이 완료된다.

## 7. 제외 범위

- Truss, bar, plane, solid, shell 및 다른 Beam 요소
- 여러 step과 하중 이력
- 여러 Assembly/Instance, Instance 평행이동·회전 및 instance-local mesh 수정
- 분포하중, 압력, 중력 및 체적력
- MPC, RBE2, RBE3, penalty 및 Lagrange multiplier constraint
- 기하·재료 비선형, 접촉, 좌굴, 모달, 동적 및 열전달
- 소성, 직교이방성 및 사용자 재료
- 단면 오프셋, 곱관성모멘트, 전단중심 편심 및 워핑
- 점별 전단·비틀림 응력
- 단위 변환
- 외부 고객용 installer와 API 호환성 보장

## 8. 내부 배포 수용 조건

- MSVC Debug와 Release 구성에서 새 경고 없이 빌드
- 모든 GoogleTest/CTest와 Harness 검증 통과
- 테스트 0개 수집이 아님을 확인
- 전체 입력-해석-출력 통합 테스트 통과
- physics sanity와 평형 잔차 기준 통과
- 현재 Abaqus 2024 변위·반력 골든 결과의 tolerance 통과
- 요소 내력·도심 응력 CSV adapter와 비교 kernel의 synthetic 검증 통과
- HDF5 schema, 입력 부분집합, 정식화 및 검증 보고서 제공
