main
Dynamics
多语言动力学数值积分与轨迹可视化框架。
支持 Python、C、C++、Fortran 多种语言实现同一套物理引擎,共享同一套可视化管线
(抽帧、绘图、3D 动画),直接在 input.txt 中切换引擎即可对比性能。
快速开始
# 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 格式)
所有控制集中在一个文件里:
# ── 计算引擎 ──────────────────────────────────
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]
多语言引擎
一键切换
# input.txt 中改一行
engine: c # 切换到 C 引擎
engine: python # 切回 Python
编译 C 引擎
方式一:CMake(推荐,跨平台)
# 安装 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(最快)
cd engines/c
gcc -O3 -march=native -o build/dynamics_c.exe main.c -lm
交叉编译
从任意平台编译到其他平台:
# 编译到 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):
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) |
可选 |
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 参考实现结果一致
- 可视化:一套代码搞定所有语言的轨迹展示
Description
Languages
Python
57.4%
Fortran
14.9%
C
11.9%
C++
11.9%
CMake
2.9%
Other
1%