# Dynamics

多语言动力学数值积分与轨迹可视化框架。

支持 Python、C、C++、Fortran 多种语言实现同一套物理引擎，共享同一套可视化管线
（抽帧、绘图、3D 动画），直接在 `input.txt` 中切换引擎即可对比性能。

## 快速开始

```bash
# 1. 安装依赖
pip install numpy pyyaml matplotlib tqdm

# 2. 运行案例（计算 + 抽帧 + 绘图 + 动画）
py -3 examples/case01/run_dynamics.py

# 3. 仅计算（跳过绘图，最小依赖）
py -3 examples/case01/run_dynamics.py --no-plot

# 4. 仅播放动画（需先安装 VisPy）
pip install vispy PyQt5
py -3 draw.py examples/case01/output
```

## 目录结构

```
Dynamics/
├── dynamics.py              ← 统一入口：调度引擎、抽帧、绘图、动画
├── compute.py               ← Python 参考引擎 + 外部引擎调度
├── draw.py                  ← VisPy 3D 动画（所有引擎共用）
├── plot_trajectory.py       ← Matplotlib 静态绘图
├── sample.py                ← 抽帧生成显示数据
├── export_web_data.py       ← 导出 Web 可视化数据
│
├── engines/                 ← 多语言计算引擎
│   ├── c/                   ← C 语言 (完整实现，已编译)
│   │   ├── main.c
│   │   ├── Makefile
│   │   └── build/dynamics_c.exe
│   ├── cpp/                 ← C++ (模板)
│   │   └── main.cpp
│   └── fortran/             ← Fortran (模板)
│       └── main.f90
│
├── examples/
│   └── case01/
│       ├── input/
│       │   ├── input.txt         ← 唯一配置文件（YAML 格式）
│       │   ├── coord.txt
│       │   ├── connection.txt
│       │   └── bond.txt
│       └── output/
│           ├── trajectory.txt   ← 完整轨迹
│           ├── display.txt      ← 抽帧数据（动画用）
│           ├── trajectory_plots.png
│           └── dynamics.log     ← 计算日志
│
└── .workbuddy/memory/        ← 工作记忆（AI 辅助开发用）
```

## 配置文件 (`input.txt` — YAML 格式)

所有控制集中在一个文件里：

```yaml
# ── 计算引擎 ──────────────────────────────────
engine: python       # python | c | cpp | fortran

# ── 流程控制（每步独立开关） ─────────────────
step_simulate:  1    # 运行物理模拟
step_sample:    1    # 抽帧
step_plot:      1    # 绘图
step_animation: 0    # VisPy 3D 动画

# ── 物理参数 ──────────────────────────────────
G: [0.0, 0.0, -9.8]  # 重力
B: [0.0, 0.0, 0.0]   # 阻尼
method: leapfrog      # explicit_euler | implicit_euler | midpoint | leapfrog
NT: 100000
DT: 0.0001
NSTEP: 1000

# ── 显示参数 ──────────────────────────────────
# 六个面的透明度，按 [-x,+x,-y,+y,-z,+z] 顺序
alpha: [0.0, 0.0, 0.2, 0.2, 0.0, 0.0]
```

## 多语言引擎

### 一键切换

```yaml
# input.txt 中改一行
engine: c        # 切换到 C 引擎
engine: python   # 切回 Python
```

### 编译 C 引擎

**方式一：CMake（推荐，跨平台）**

```bash
# 安装 CMake (https://cmake.org/download/)
# 然后：
cmake -B build                 # 配置
cmake --build build            # 编译全部
cmake --build build --target dynamics_c   # 只编译 C 引擎

# 编译完成后：
py -3 examples/case01/run_dynamics.py   # 配合 Python 调度器使用
```

**方式二：直接 gcc（最快）**

```bash
cd engines/c
gcc -O3 -march=native -o build/dynamics_c.exe main.c -lm
```

### 交叉编译

从任意平台编译到其他平台：

```bash
# 编译到 Windows（需 mingw-w64）
cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-mingw.cmake
cmake --build build

# 编译到 Linux（需 Linux 交叉编译器）
cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-linux.cmake
cmake --build build

# 编译到 macOS（需 osxcross）
cmake -B build -DCMAKE_TOOLCHAIN_FILE=cmake/toolchain-macos.cmake
cmake --build build
```

或用 Python 一键脚本（自动调用 CMake）：

```bash
py -3 build_engines.py                    # 本地编译全部
py -3 build_engines.py --target dynamics_c  # 只编译 C 引擎
py -3 build_engines.py --clean             # 清理后重新编译
```

所有平台统一输出到 `engines/*/build/dynamics_c.exe`，Python 自动识别调用。

### 性能对比 (case01, 10000步)

| 引擎 | 耗时 | 相对速度 |
|------|------|----------|
| Python | ~1.3 s | 1× |
| C      | ~0.05 s | 26× |

## 3D 动画功能

运行 `py -3 draw.py examples/case01/output` 后：

| 操作 | 说明 |
|------|------|
| 鼠标拖拽 | 旋转视角 |
| 滚轮 | 缩放 |
| 点击 **`reset`** | 复位相机 + 从头播放 |
| 点击 **`info`** | 显示/隐藏信息面板 |
| 点击 **`axes`** | 显示/隐藏坐标轴 |
| `Q` / `E` 键 | 绕屏幕法线旋转 90° |

所有原子用 tab10 调色板着色，成键用灰色线段连接。

## 依赖

| 用途 | 包 | 是否必需 |
|------|----|---------|
| 数值计算 | `numpy` | 是 |
| 配置解析 | `PyYAML` | 是 |
| 进度条 | `tqdm` | 推荐 |
| 静态绘图 | `matplotlib` | 可选 |
| 3D 动画 | `vispy` + `PyQt5` | 可选 |
| C/C++/Fortran 编译 | `cmake` (>= 3.15) | 可选（编译引擎时） |
| C 快速编译 | `gcc` (MSYS2/MinGW) | 可选 |

```bash
pip install numpy pyyaml tqdm matplotlib vispy PyQt5
```

## 工作原理

```
input.txt
      │
      ▼
 dynamics.py ──→ run_from_config() 加载全局参数
      │
      ├── engine=python? → compute.py → run_simulation()
      │                                   (Leapfrog / Euler)
      └── engine=c?      → subprocess → engines/c/dynamics_c.exe
                                           (Leapfrog in C)
      │
      ▼
 trajectory.txt (JSON, 统一格式)
      │
      ▼
 sample.py → display.txt (抽帧数据)
      │
      ├── plot_trajectory.py → trajectory_plots.png
      └── draw.py            → VisPy 3D 窗口
```

所有引擎的输出都是相同格式的 `trajectory.txt`（JSON 嵌套数组），
后续的抽帧、绘图、动画完全复用，每个引擎只需实现纯计算逻辑。

## 项目初衷

- **教学**：对比不同语言的数值计算性能
- **验证**：确保 C/C++/Fortran 实现与 Python 参考实现结果一致
- **可视化**：一套代码搞定所有语言的轨迹展示
