beidou
#1
作业1
作业描述
最简单的弱可压缩的光滑粒子动力学(weakly compressible smoothed particle hydrodynamics)。
目前还有很多BUG。
主要是参考Doyub Kim的那本书《Fluid Engine Development》
实在写得太烂了勉强能运行…
完全不懂SPH也不懂编程,从头看书学,熬了一多月,总算写完了一个作业了。还能凑数抽个奖吗?
希望各位大佬能帮我找找错误,不知道为什么粒子特别散(还很飘),而且运行到后面粒子还会从两边丢失。
(里面写了个word文档把我的BUG描述的很详细)
效果展示
代码链接
https://github.com/chunleili/WCSPHTaichiHW
6 个赞
beidou
#2
好吧,bug算是解决了吧,其实就是粘度参数给小了。。。
单纯把粘度调大五十倍就行了。。。
beidou
#3
还有,突然发现官方给了sph的算例。。。
叫pbf2d.py。。。
话说为啥不直接叫SPH啊。。。
YuPeng
#5
这是参考Postion based dynamics这篇文章写的流体仿真。
beidou
#6
哦哦,没仔细看,原来是position based
beidou
#7
1 个赞
beidou
#9
为了方便各位朋友们后面不踩坑,我总结下自己踩的坑
编程过程中可能会出现的重要BUG总结:
(具体叙述可见代码内word文档)
1 边界溢出问题
这个BUG卡了我将近两个星期。
总结如下:
在利用基于网格的链表搜索法进行邻域搜索时
边界需要一定的padding以防止网格编号溢出
假如每行存储25个网格,一共排列25行。那么网格编号排列如下
假如采用如下计算编号的公式:
其中[]代表向下取整。posX和posY是粒子位置,4是网格尺寸
举例:
对于(100,100), 位于右上,
计算为[100/4]+[100/4]*25=650错误 实际为624
原因:
当粒子在上边界和右边界的时候,cell ID的计算会超出网格总数
解决方案:
- 在边界处增加一些padding(类似页边距)
如处理右边界的时候增加一个eps的裕量:
if position[i].x >= boundX - eps:
position[i].x = boundX - eps
...
- 同时计算时统一把整体网格向下平移0.5个单位,即采用如下公式:
cellID=[posX/4-0.5]+[posY/4-0.5]*25
5 个赞