9d1f84d2bf
核心变更: 1. compute.py: run_simulation 直接按 NSTEP 抽帧写 display.txt(新格式) - 新格式:纯文本,帧 1→n 分块,每行: n x y z vx vy vz - 新函数 save_display_txt() / load_display_txt() - save_trajectory 参数(默认0=不保留 trajectory.txt) 2. dynamics.py: 移除旧 JSON 采样逻辑,自动检测 display.txt - Python 引擎直接读取引擎输出的 display.txt - 外部引擎仍写 trajectory.txt,自动抽帧转 display.txt 3. draw.py: 适配 load_display_txt() 新格式 4. case06/input.txt: 添加 save_trajectory: 0, step_sample: 0 TODO: 外部引擎(C/C++/Fortran)内部抽帧写 display.txt TODO: plot_wave.py 适配新格式 TODO: 其他案例 input.txt 更新默认值
case06: 一维原子链横波模拟
60 个原子沿 x 轴排列,相邻原子用弹簧连接。原子 1 受 z 方向驱动力作用,产生沿链传播的横波。
物理设定
| 参数 | 值 |
|---|---|
| 原子数 | 120 |
| 排列 | 沿 x 轴等间距排列,间距为 1 |
| 约束 | 原子沿 z 方向自由振动(fix_x=1, fix_y=1, fix_z=0),x, y 锁定 |
| 弹簧 | 劲度系数 k=1.0,原长 L₀=1.0 |
| 重力 | 无 |
| 万有引力 | 无 |
| 阻尼 | 无 |
| 驱动力 | 原子 1(z 方向驱动) |
| 算法 | leapfrog(蛙跳法,能量守恒) |
驱动力
原子 1 的位置由 input/driver.txt 中的驱动力公式决定:
z(t) = A_z \cdot \cos(2\pi f_z t + \phi_z)
当前参数:A_z = 0.5, f_z = 0.1 Hz, φ_z = 90°, period = all(全程驱动)。
动力学行为
原子 1 沿 z 方向的受迫振动通过弹簧逐次传递给相邻原子,形成沿链传播的横波。由于 z 方向的振动是横向的,弹簧大部分张力在 x 方向,z 方向的有效刚度是非线性的——等效于一个三次方恢复力(FPU 型非线性),因此波速较慢。
使用方法
cd examples/case06
python run_dynamics.py
配置参数详见 input/input.txt,驱动力定义见 input/driver.txt,完整文档见 doc/index.html。