# Step 3: Timoshenko Stiffness Kernel

## 읽어야 할 파일

- `/AGENTS.md`
- `/docs/PRD.md`
- `/docs/ARCHITECTURE.md`
- `/docs/ADR.md`
- `/docs/superpowers/plans/2026-07-29-fesa-phase-1.md`
- `/include/fesa/fem/`
- `/include/fesa/model/material.hpp`
- `/include/fesa/model/beam_section.hpp`
- `/docs/formulation/timoshenko-beam-3d.md`가 있으면 전체

## 작업

먼저 `docs/formulation/timoshenko-beam-3d.md`에 자유도 순서, 변형률, 부호,
constitutive matrix, Jacobian과 선택적 감차적분 식을 작성한다. 그 식으로 실제
2절점 3D isoparametric Timoshenko Beam stiffness를 구현한다.

```cpp
struct Beam3D2Input final {
    std::array<Vec3, 2> coordinates;
    IsotropicElastic material;
    BeamSection section;
};
struct Beam3D2Contribution final {
    Matrix12 local_stiffness;
    Matrix12 global_stiffness;
    BeamFrame frame;
};
[[nodiscard]] BeamKernelResult compute_beam3d2(const Beam3D2Input&);
```

- 축·굽힘·비틀림은 2점, 전단은 1점 Gauss 적분한다.
- \(G=E/[2(1+\nu)]\)를 사용한다.
- 먼저 대칭성, 강체운동 zero energy, 축/비틀림/굽힘 해석해, shear-dominant,
  세장비 sweep과 좌표회전 invariant 테스트를 실패시킨다.

## Acceptance Criteria

```powershell
cmake --build --preset windows-debug
ctest --preset windows-debug -R "Beam3D2|Timoshenko|RigidBody" --output-on-failure
ctest --preset windows-debug --output-on-failure
```

## 검증 절차

1. 정식화 문서를 production code보다 먼저 확정한다.
2. 실패 테스트를 실행해 가짜 matrix로 통과하지 않음을 확인한다.
3. 최소 kernel을 구현하고 focused/full test를 실행한다.
4. 식과 코드의 DOF/component 순서를 대조하고 index를 갱신한다.

## 금지사항

- 닫힌형 가짜 stiffness를 임시로 넣지 마라. 이유: 파이프라인 수치 신뢰성을 훼손한다.
- shear term을 2점 적분하지 마라. 이유: 승인된 selective integration과 다르다.
- 비선형, 워핑, offset 또는 \(I_{yz}\)를 추가하지 마라. 이유: Phase 1 밖이다.
