并行计算方法,张量编程和OPP编程的对比。
还应该继续提升碰撞后的反应,当粒子数变多以后似乎能量不守恒,速率分布奇怪。还没有完成模块化改造,有时间再修改吧,已经能跑了!
多个粒子的状态需要每一帧更新,这样的动态变化非常适合并行计算。粒子的动力学量为 pytorch
的算子加速并行计算。
本次模拟是不考虑重力的弹性碰撞,核心数据就是坐标张量coords
与速度张量velocs
最费算力的地方在于粒子间的碰撞检测,这里用组合数来检测距离的方法torch.combinations()
。计算机图形学和分子动力学中有许多更高效的碰撞检测方法,这里就不去实现了,就用暴力方法吧,待改进。
问题一:帧间隔太慢
在碰撞检测成功以后,我们虽然更新了速度矢量,但是会出现新bug,由于粒子有体积,因此会出现小球还没分开,但是下一次碰撞检测又被检测出来的情况,此时两个碰撞的粒子会不断纠缠在一起。
问题二:帧间隔太快
如果在一次计算间隔中,小球前进距离大于
可以利用演化结果验证2D麦克斯韦-玻尔兹曼速率分布,即
ax.hist()
直方图用update
方法画动图有问题,不能和其它元素ax.text()
一起刷新