我希望以下问题不会被认为是含糊的。我试图直接问这个问题,而不涉及太多关于我的代码的信息。作为我博士论文的一部分,我目前正在为自定义应用程序开发分子动力学代码。通过直接比较来自 lammps 的数值,我一遍又一遍地检查了力子程序(非键合和键合)的有效性。集成例程与我之前用于重现 LJ 状态数据方程的程序相同,因此我假设它们是 verlet 算法的正确形式。然而,我仍然有一个偷偷摸摸的怀疑,我正在经历比我应该的更多的能量漂移。例如,我最近进行的一项测试是 92.1*92.1*92.1 埃盒子中的 1 个甘氨酸分子。我正在使用带有狼求和的 OPLS 力场来进行静电。我将漂移定义为
漂移=(总势+动-总初始能量)/总初始能量
经过 50,000 步(1.0 fs 时间步,没有抖动,只是蛮力 MD),漂移值超过 0.07 (7%)。为了测试我关于积分器正确的假设是否正确,我运行了 100k 次迭代的模拟,时间步长为 0.5 fs,一次为 1.0 fs。我提供了能量漂移图。对于这些模拟,优化标志设置为 -O0。通过将 dthalf 乘以 0.0004184,力在内部从 kcal/mol/A 转换为 amu*A/fs^2。
鉴于我以全双精度运行,
1)如何确定代码库中可能的能量漂移源?例如,如果我将相同的模拟与灯和我自己的运行进行比较,发现我的漂移更大,我该如何机械地确定这个错误的可能来源在我的代码行中?我应该进行哪些测试?
2) 可接受的能量漂移的经验法则是什么?例如,我如何量化模拟是遵循“良好”的能量漂移还是“差”的能量漂移。这个公制大小是否取决于?