假设我们有一个系统通过 Lennard-Jones 势相互作用的粒子
我被困在一个重要的部分。我不确切知道如何计算每个原子上的力。我知道要计算一个原子上的力,我必须考虑它与所有其他原子的相互作用。但是,我对如何将这些力量组合在一起感到困惑。特别是,我不知道如何正确地确定力量的方向(标志)。
目前,我的方法是考虑,, 和在计算力/加速度时分别计算给定原子的分量。我访问一个原子与所有其他原子的相互作用并计算力,,. 对于每个组件,我将它们全部加起来,假设这种方法最终使我在每个方向上都有净加速度。我想我可以使用 、 和 的最终值atm.ax来atm.ay更新atm.az原子的位置和速度。
void computeForce(Atom atm){
for(int i=0;i<N_particles;i++){
if(i==atm.index)
continue;
else{
dx = PBC1D(atm.x - allAtm[i].x);
dy = PBC1D(atm.y - allAtm[i].y);
dz = PBC1D(atm.z - allAtm[i].z);
atm.ax += force(dx) / m;
atm.ay += force(dy) / m;
atm.az += force(dz) / m;
}
}
(Atom是一个用户定义的类;PBC1D允许周期性边界条件——这对我的问题并不重要。)
尽管我目前的方法对我来说是有意义的,但我感觉它不完整,而且效率可能非常低。谁能帮助我了解我所做的是否正确?而且,也许教我更好的方法?