我正在 Python 中对 Argon 液体进行分子动力学模拟。我有一个稳定版本正在运行,但是它运行缓慢,超过 100 个原子。我确定瓶颈是以下嵌套的 for 循环。这是从我的 main.py 脚本调用的函数中进行的力计算:
def computeForce(currentPositions):
potentialEnergy = 0
force = zeros((NUMBER_PARTICLES,3))
for iParticle in range(0,NUMBER_PARTICLES-1):
for jParticle in range(iParticle + 1, NUMBER_PARTICLES):
distance = currentPositions[iParticle] - currentPositions[jParticle]
distance = distance - BOX_LENGTH * (distance/BOX_LENGTH).round()
#note: this is so much faster than scipy.dot()
distanceSquared = distance[0]*distance[0] + distance[1]*distance[1] + distance[2]*distance[2]
if distanceSquared < CUT_OFF_RADIUS_SQUARED:
r2i = 1. / distanceSquared
r6i = r2i*r2i*r2i
lennardJones = 48. * r2i * r6i * (r6i - 0.5)
force[iParticle] += lennardJones*distance
force[jParticle] -= lennardJones*distance
potentialEnergy += 4.* r6i * (r6i - 1.) - CUT_OFF_ENERGY
return(force,potentialEnergy)
大写字母中的变量是常量,在 config.py 文件中定义。“currentPositions”是一个 3 的粒子数矩阵。
我已经用 scipy.weave 实现了嵌套 for 循环的一个版本,它的灵感来自这个网站:http ://www.scipy.org/PerformancePython 。
但是,我不喜欢失去灵活性。我对“矢量化”这个 for 循环很感兴趣。我只是不明白它是如何工作的。任何人都可以给我一个线索或一个很好的教程来教这个吗?