Files
dynamics/examples/case06
admin 9d5997afec fix(c): read_bonds 中 rewind 后未跳过表头行导致成键数据全为空
rewind(f) 将文件指针拉回开头(含表头 'n1 n2 bond_name'),
后续 fscanf 试图将 'n1' 解析为 %d 全部失败,导致:
- bond_pairs 直接用未初始化的栈垃圾 → 随机索引
- bond_stiffness/rest_lengths 保持默认值 1.0/2.0
- 弹簧力无法正确传播 → 第一个原子动后后面全不动

修复:rewind 后加 fgets(line, ...) 再次跳过表头。
2026-06-11 19:38:10 +08:00
..

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
重力
万有引力
阻尼
驱动力 原子 1z 方向驱动)
算法 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