# Dynamics 示例案例

本目录包含 10 个从简单到复杂的物理模拟案例，均基于 `../dynamics.py` 框架运行。

---

## 案例一览

| 案例 | 标题 | 简介 | 原子数 | 引擎 | 力类型 |
|------|------|------|--------|------|--------|
| [case01](./case01/) | **双粒子弹簧系统** | 两个原子由弹簧连接，在重力场中运动 | 2 | Python | 重力 + 弹簧 |
| [case02](./case02/) | **行星运动** | 地球绕太阳椭圆公转（万有引力） | 2 | Python | 万有引力 |
| [case03](./case03/) | **日地月系统（失稳）** | 地球绕太阳、月球绕地球，参数不当导致失稳 | 3 | Python | 万有引力 |
| [case04](./case04/) | **日地月系统（稳定）** | 地球绕太阳、月球绕地球，稳定轨道 | 3 | Python | 万有引力 |
| [case05](./case05/) | **一维原子链纵波** | 驱动原子 1 沿 x 轴振动，产生纵波传播 | 60 | Python | 弹簧 + 驱动力 |
| [case06](./case06/) | **一维原子链横波（阻尼）** | 驱动原子 1 沿 z 轴振动，带阻尼的横波传播 | 120 | C | 弹簧 + 阻尼 + 驱动力 |
| [case07](./case07/) | **一维原子链横波（双端驱动）** | 原子 1 和原子 120 同时受 z 方向驱动 | 120 | C | 弹簧 + 阻尼 + 驱动力 |
| [case08](./case08/) | **双原子弹簧（C 引擎测试）** | 两个原子弹簧系统，C 引擎快速验证 | 2 | C | 弹簧 + 阻尼 + 驱动力 |
| [case09](./case09/) | **一维链纵波（Fortran 引擎）** | Fortran 引擎驱动的纵波传播测试 | 40 | Fortran | 弹簧 + 驱动力 |
| [case10](./case10/) | **一维链纵波（能量分析）** | 纵波传播 + 轨迹/能量图绘制 | 40 | C | 弹簧 + 驱动力 |

---

## 各案例详细说明

### case01 — 双粒子弹簧系统

两个原子通过弹簧连接，在均匀重力场中自由运动。原子 1 位于 x=-1，原子 2 位于 x=1（初始 z=1），展示了在重力作用下的耦合振动与落体运动的复合。

- **力开关**：重力场开，弹簧键力开
- **算法**：leapfrog（蛙跳法）
- **物理**：重力 m·g + 弹簧胡克力
- **渲染**：Sphere 模式（精细网格球体）

### case02 — 行星运动

模拟地球绕太阳的椭圆轨道运动（一个固定大质量中心体 + 一个绕行小质量体）。采用万有引力相互作用。

- **力开关**：万有引力开（含强度参数 `gravity_strength: 100.0`）
- **算法**：leapfrog（蛙跳法）
- **物理**：牛顿万有引力 F = G·m₁·m₂/r²
- **渲染**：Sphere 模式

### case03 — 日地月系统（失败案例）

三体系统：太阳（中心）、地球、月球。由于初始条件或参数设置不当，轨道不稳定，展示了数值模拟中参数选择的重要性。

- **力开关**：万有引力开
- **算法**：leapfrog（蛙跳法）
- **状态**：轨道发散或碰撞

### case04 — 日地月系统（成功案例）

与 case03 相同的三体系统，但采用了恰当的初始条件和参数，地球和月球都能维持稳定的轨道运动。

- **力开关**：万有引力开
- **算法**：leapfrog（蛙跳法）
- **状态**：稳定椭圆轨道

### case05 — 一维原子链纵波

60 个原子沿 x 轴等间距排列（间距 1），相邻原子用弹簧（k=1.0, L₀=1.0）连接。原子 1 受 x 方向驱动力 `x(t)=0.5·cos(2π·t)`，产生沿链传播的**纵波**（压缩波/疏密波）。原子 x 方向自由（fix_x=0），y/z 锁定。

- **力开关**：弹簧键力开，驱动力开
- **算法**：leapfrog（蛙跳法）
- **波速**：快（x 方向弹簧力为线性）
- **渲染**：Marker 模式（GPU 实例化，60 原子）

### case06 — 一维原子链横波（带阻尼）

120 个原子沿 x 轴等间距排列（间距 1），相邻原子用弹簧（k=1.0, L₀=1.0）连接，带横向阻尼（B=[0.01, 0, 0.01]）。驱动在 z 方向 `z(t)=0.5·cos(2π·0.1·t+90°)`，原子 z 方向自由（fix_z=0），x/y 锁定。

- **力开关**：弹簧键力开，驱动力开，阻尼开
- **算法**：leapfrog（蛙跳法）
- **引擎**：C（高性能）
- **参数**：T_total=1000, NSTEP=500
- **波速**：慢（z 方向弹簧力呈几何非线性，类似 FPU 系统）

### case07 — 一维原子链横波（双端驱动）

120 个原子沿 x 轴排列，原子 1 **和**原子 120 同时受 z 方向驱动力驱动（频率相同，初相位错开 90°），产生两端向中间传播的横波相遇。

- **力开关**：弹簧键力开，驱动力开，阻尼开
- **引擎**：C
- **参数**：T_total=1000, NSTEP=500
- **视觉放大**：z 方向位移放大 10 倍（`display_amp: [1, 1, 10]`），便于观察小幅度横波

### case08 — 双原子弹簧（C 引擎快速测试）

2 个原子的简单弹簧系统，用于快速验证 C 引擎的正确性和性能。T_total 仅为 100s。

- **力开关**：弹簧键力开，驱动力开，阻尼开
- **引擎**：C
- **用途**：引擎验证 / 调试
- **视觉放大**：z 方向位移放大 10 倍
- **动画**：关闭（step_animation=0），仅输出波形图

### case09 — 一维链纵波（Fortran 引擎）

40 个原子沿 x 轴排列，使用 **Fortran 引擎**驱动的纵波传播模拟。验证 Fortran 引擎的输出兼容性和性能。

- **力开关**：弹簧键力开，驱动力开，阻尼关
- **引擎**：Fortran
- **参数**：T_total=200, NSTEP=100
- **视觉放大**：z 方向位移放大 10 倍

### case10 — 一维链纵波（能量分析）

40 个原子沿 x 轴排列，纵波传播。与 case05 相比，x/y/z 全部自由（fix_x/y/z 均为 0），物理行为更复杂。支持轨迹/能量图绘制（step_plot=1）。

- **力开关**：弹簧键力开，驱动力开，阻尼关
- **引擎**：C
- **参数**：T_total=10, NSTEP=20
- **视觉放大**：z 方向位移放大 10 倍
- **动画**：关闭（step_animation=0），仅输出轨迹/能量图

---

## 通用使用方法

```bash
# 进入任意案例目录
cd examples/case05

# 完整运行（模拟 + 3D 动画）
python run_dynamics.py

# 仅运行模拟，跳过 3D 动画
python run_dynamics.py --no-plot

# 手动查看 3D 动画
python ../../draw.py output/
```

每个案例的 `input/input.txt` 中可配置所有物理参数、力开关、算法、渲染方式等。

## 案例选择指南

| 你想做什么 | 推荐案例 |
|-----------|---------|
| 快速上手、理解基本框架 | case01 |
| 天体力学 / 万有引力 | case02 / case04 |
| 波动物理（纵波） | case05 |
| 波动物理（横波、非线性、阻尼） | case06 |
| 双端驱动/波干涉 | case07 |
| 对比不同引擎性能 | case08 (C) / case09 (Fortran) |
| 能量分析 | case10 |

## 框架结构

```
dynamics/
├── dynamics.py          # 统一运行入口
├── compute.py           # Python 物理引擎
├── draw.py              # VisPy 3D 动画
├── plot_wave.py         # 波形能量图（需 matplotlib）
├── engines/             # C / C++ / Fortran 引擎
├── examples/            # 案例（本目录）
│   ├── case01/
│   ├── ...
│   └── case10/
└── output/              # 默认输出目录
```
