fix: leapfrog 模式缺少边界反弹,粒子穿透地板
问题:leapfrog 模式的主循环直接调用 leapfrog_staggered_step, 未经过 apply_motion_update,因此 Limit_in_box(边界反弹) 从未被执行。粒子超出 z<-20 后被 wrap_position 回绕到顶端, 导致物理行为完全错误。 修复: 1. 在预热和记录两个循环中,leapfrog 路径后显式调用 Limit_in_box(与 apply_motion_update 内的非 leapfrog 路径一致) 2. 移除 apply_motion_update 末尾重复的 Limit_in_box 调用 (统一到主循环中执行)
This commit is contained in:
+6
-4
@@ -1798,10 +1798,6 @@ def apply_motion_update(x, y, z, vx, vy, vz, dt, m, g, b):
|
||||
x, y, z, vx, vy, vz = Leapfrog_Method(x, y, z, vx, vy, vz, dt, m, g, b)
|
||||
else:
|
||||
raise ValueError(f"未知算法: {METHOD}")
|
||||
|
||||
x, vx = Limit_in_box(x, X_MIN, X_MAX, vx)
|
||||
y, vy = Limit_in_box(y, Y_MIN, Y_MAX, vy)
|
||||
z, vz = Limit_in_box(z, Z_MIN, Z_MAX, vz)
|
||||
return x, y, z, vx, vy, vz
|
||||
|
||||
|
||||
@@ -1870,6 +1866,9 @@ def run_simulation(save_trajectory=0):
|
||||
x, y, z, vx, vy, vz, DT, ATOM_MASSES, G, B)
|
||||
else:
|
||||
x, y, z, vx, vy, vz = apply_motion_update(x, y, z, vx, vy, vz, DT, ATOM_MASSES, G, B)
|
||||
x, vx = Limit_in_box(x, X_MIN, X_MAX, vx)
|
||||
y, vy = Limit_in_box(y, Y_MIN, Y_MAX, vy)
|
||||
z, vz = Limit_in_box(z, Z_MIN, Z_MAX, vz)
|
||||
x, y, z = wrap_position(x, y, z)
|
||||
x, y, z, vx, vy, vz = apply_fixed_constraints(x, y, z, vx, vy, vz)
|
||||
print(
|
||||
@@ -1924,6 +1923,9 @@ def run_simulation(save_trajectory=0):
|
||||
x, y, z, vx, vy, vz, DT, ATOM_MASSES, G, B)
|
||||
else:
|
||||
x, y, z, vx, vy, vz = apply_motion_update(x, y, z, vx, vy, vz, DT, ATOM_MASSES, G, B)
|
||||
x, vx = Limit_in_box(x, X_MIN, X_MAX, vx)
|
||||
y, vy = Limit_in_box(y, Y_MIN, Y_MAX, vy)
|
||||
z, vz = Limit_in_box(z, Z_MIN, Z_MAX, vz)
|
||||
x, y, z = wrap_position(x, y, z)
|
||||
x, y, z, vx, vy, vz = apply_fixed_constraints(x, y, z, vx, vy, vz)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user