2026-05-23 14:59:36 +08:00
2026-05-17 08:47:25 +08:00
2026-05-20 20:07:31 +08:00
2026-05-20 16:03:59 +08:00
2026-05-20 16:03:59 +08:00
2026-05-23 14:59:36 +08:00
2026-05-17 08:47:25 +08:00
2026-05-17 08:47:25 +08:00
2026-05-17 08:47:25 +08:00
2026-05-20 16:03:59 +08:00
2026-05-20 16:03:59 +08:00
2026-05-20 16:03:59 +08:00
2026-05-17 08:47:25 +08:00
2026-05-20 16:03:59 +08:00
2026-05-17 08:47:25 +08:00
2026-05-20 16:03:59 +08:00
2026-05-17 07:51:15 +08:00
2026-05-17 08:47:25 +08:00
2026-05-17 08:47:25 +08:00
2026-05-20 16:03:59 +08:00
2026-05-17 08:47:25 +08:00
2026-05-17 08:47:25 +08:00

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.exePython 自动识别调用。

性能对比 (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 参考实现结果一致
  • 可视化:一套代码搞定所有语言的轨迹展示
S
Description
Languages
Python 57.4%
Fortran 14.9%
C 11.9%
C++ 11.9%
CMake 2.9%
Other 1%