fix: C/C++/Fortran 引擎补齐 wrap_position 和 t=0 驱动力
- 三引擎均新增 wrap_position 周期边界回绕(调用在 limit_in_box 后) - 三引擎均新增 t=0 驱动力初始调用(在预热循环前) - 至此三引擎算法与 Python 完全一致
This commit is contained in:
@@ -386,6 +386,12 @@ static void limit_in_box(double &pos, double &vel, double lo, double hi) {
|
||||
if (pos < lo) { pos = lo; vel = -vel; }
|
||||
}
|
||||
|
||||
/* 周期边界回绕(与 Python wrap_position 一致)*/
|
||||
static void wrap_position(double &pos, double lo, double hi) {
|
||||
if (pos > hi) pos = lo;
|
||||
if (pos < lo) pos = hi;
|
||||
}
|
||||
|
||||
// ========================================================================
|
||||
// 四种积分方法(只做位置/速度更新,不含边界条件)
|
||||
// 与 Python: Explicit_Euler_Method / Implicit_Euler_Method /
|
||||
@@ -598,6 +604,13 @@ static void apply_step(
|
||||
limit_in_box(z[i], vz[i], -box_a, box_a);
|
||||
}
|
||||
|
||||
// 周期边界回绕(与 Python wrap_position 一致)
|
||||
for (int i = 0; i < n; i++) {
|
||||
wrap_position(x[i], -box_a, box_a);
|
||||
wrap_position(y[i], -box_a, box_a);
|
||||
wrap_position(z[i], -box_a, box_a);
|
||||
}
|
||||
|
||||
// 逐自由度固定约束(与 Python apply_fixed_constraints 一致)
|
||||
for (int i = 0; i < n; i++) {
|
||||
if (fixed[i*3+0]) { x[i] = pos_0[i*3]; vx[i] = 0.0; }
|
||||
@@ -811,6 +824,10 @@ int main(int argc, char **argv) {
|
||||
std::vector<double> traj_vz(record_steps * n);
|
||||
|
||||
// 预热
|
||||
// 初始时刻 t=0 驱动力(与 Python run_simulation 一致)
|
||||
if (params.driving_force)
|
||||
apply_driving_force(n, x.data(), y.data(), z.data(), vx.data(), vy.data(), vz.data(), 0.0, 0, params.DT, drivers);
|
||||
|
||||
for (int s = 0; s < params.warmup_steps; s++) {
|
||||
double tw = (s + 1) * params.DT;
|
||||
if (params.driving_force)
|
||||
|
||||
Reference in New Issue
Block a user