10 个从简单到复杂的物理模拟案例,展示分子动力学模拟框架的多种应用场景
两个原子由弹簧连接,在重力场中运动
地球绕太阳椭圆公转(万有引力)
三体系统参数不当导致轨道发散
三体系统稳定轨道,经希尔半径检验
驱动原子 1 沿 x 振动,产生纵波传播
带阻尼的横波传播(FPU 非线性)
原子 1 + 原子 120 同时驱动,波相遇干涉
2 原子快速验证 C 引擎正确性
Fortran 引擎驱动的纵波,GPU 实例化渲染
纵波传播 + 轨迹/能量图绘制
两个原子通过弹簧连接,在均匀重力场(G=[0,0,-9.8])中自由运动。展示重力作用下的耦合振动与落体运动的复合。
模拟地球绕太阳的椭圆轨道运动。大质量中心体固定,小质量体绕行。
与 case03 相同的三体系统,但采用恰当的初始条件:地球置于近日点($r=10$),$v_z=520$ 接近圆轨道;月球缩至希尔半径($r_H\approx1.0$)以内的 $r=0.5$,相对速度 $v_{\text{rel}}\approx127$,确保月球被地球稳定束缚。
60 原子沿 x 轴排列。原子 1 受 x 方向驱动力,产生沿链传播的纵波(压缩波)。原子 x 自由,y/z 锁定。
120 原子沿 x 轴排列,带横向阻尼。驱动沿 z 方向,原子 z 自由,x/y 锁定。横波传播具有 FPU 型非线性。
120 原子,原子 1 和原子 120 同时受 z 方向驱动(同频率、相位差 90°),两端向中间传播的横波相遇。
40 原子沿 x 轴排列,Fortran 引擎驱动的纵波传播测试。使用 use_marker: 1(GPU 实例化 Marker 模式)加速渲染,验证 Fortran 引擎与其他引擎的输出兼容性。
40 原子纵波传播,支持轨迹/能量图绘制(step_plot=1)。原子 x/y/z 全部自由。
# 进入案例目录并运行
cd examples/case05
python run_dynamics.py
# 仅运行模拟,跳过动画
python run_dynamics.py --no-plot
# 手动启动 3D 动画
python ../../draw.py output/
| 目标 | 推荐案例 |
|---|---|
| 快速上手框架 | case01 |
| 天体力学/万有引力 | case02 / case04 |
| 波动物理(纵波) | case05 |
| 波动物理(横波/非线性/阻尼) | case06 |
| 双端驱动/波干涉 | case07 |
| 引擎性能对比 | case08 (C) / case09 (Fortran) |
| 能量分析 | case10 |
每个案例的 input/input.txt 可配置物理参数、力开关、算法、引擎、渲染方式等。
外部引擎(C / C++ / Fortran)以 DLL 方式 运行,主程序通过 ctypes 在进程内直接调用,不启动子进程。DLL 预编译在 engines/release/ 中,源码位于 engines/src/{c,cpp,fortran}/。重新编译:
cd engines/src/c && make dll
dynamics/ ├── dynamics.py # 统一运行入口 ├── compute.py # 物理引擎 + 显示数据生成 ├── draw.py # VisPy 3D 动画 ├── plot_wave.py # 波形能量图 ├── .gitattributes # DLL/二进制文件保护 ├── engines/ │ ├── engine_dll.py # DLL 加载器(ctypes) │ ├── python/ # Python 引擎(dynamics_lib.py) │ ├── release/ # 预编译 DLL(C / C++ / Fortran) │ └── src/ # 引擎源码 │ ├── c/ # C 源码 + Makefile → dynamics_c.dll │ ├── cpp/ # C++ 源码 + Makefile → dynamics_cpp.dll │ └── fortran/ # Fortran 源码 + Makefile → dynamics_f90.dll ├── examples/ # 案例目录 │ ├── case01/ ~ case10/ └── output/ # 默认输出目录