我正在尝试在JavaScript中实现Clavet方法来模拟流体,因此调试非常困难,这就是为什么我在这里提问的原因,希望有人能告诉我我做错了什么。
到目前为止,我的工作还算可以:
此外,论文中还有一些我不理解的东西,比如“我们只想反射在碰撞中被省略的速度”是什么意思。为什么?能有人向我解释得简单明了点吗?
2)即使没有涉及到墙壁,模拟也会定期“爆炸”。这种情况在压力更高时发生得更多。 这是JavaScript代码,所以有那个,但我已经检查了代码,没有除以零或者我能想象出NaN的情况。
我看到报纸上有些关于模拟不稳定性的讨论,我想知道这是否就是原因。大部分文献都超出了我的理解范围。
从我所理解的(我认为),消除不稳定性的方法之一是黏度,但我添加了它,并没有帮助避免爆炸。
到目前为止,我的工作还算可以:
但我有两个问题:
1)由于在这种方法中一切都被“偏移”了半步,我不确定如何正确地将粒子从墙上弹回。目前,我取粒子的位置和先前的位置,并将它们在穿过的墙壁周围翻转,然后以一个反弹系数在穿越点周围进行缩放。
我的逻辑告诉我这应该是可行的。算法的下一步是更新粒子速度,所以我也反射了先前的位置。但实际操作中,这给了我一个我不理解的结果: 这显示了粒子所受的“力”。墙壁反射的力过大,使得一切都处于永久运动中。 这篇论文 中的公式4.58似乎可以解决这个问题,但我一直没有成功地让它起作用。此外,论文中还有一些我不理解的东西,比如“我们只想反射在碰撞中被省略的速度”是什么意思。为什么?能有人向我解释得简单明了点吗?
2)即使没有涉及到墙壁,模拟也会定期“爆炸”。这种情况在压力更高时发生得更多。 这是JavaScript代码,所以有那个,但我已经检查了代码,没有除以零或者我能想象出NaN的情况。
我看到报纸上有些关于模拟不稳定性的讨论,我想知道这是否就是原因。大部分文献都超出了我的理解范围。
从我所理解的(我认为),消除不稳定性的方法之一是黏度,但我添加了它,并没有帮助避免爆炸。
我可以发布代码,但在“让它先正常运行”阶段,现在阅读起来有些困难。
最后一个问题:我如何确定如何从此方法中的伪常量转换为物理单位?
编辑:我发现模拟有时会冻结,似乎确实在某个地方产生了NaN,但Chrome追踪得太晚了。
getAngle
。您能否发布一个完整的示例,可以将其粘贴到.html
文件中并在浏览器中运行?(即使将其放在问题末尾的代码块中也可以。) - s4y