【作业1】最简单的弱可压SPH

作业1

作业描述

最简单的弱可压缩的光滑粒子动力学(weakly compressible smoothed particle hydrodynamics)。
目前还有很多BUG。

主要是参考Doyub Kim的那本书《Fluid Engine Development》

实在写得太烂了勉强能运行…
完全不懂SPH也不懂编程,从头看书学,熬了一多月,总算写完了一个作业了。还能凑数抽个奖吗?
希望各位大佬能帮我找找错误,不知道为什么粒子特别散(还很飘),而且运行到后面粒子还会从两边丢失。
(里面写了个word文档把我的BUG描述的很详细)

效果展示

demo

代码链接

https://github.com/chunleili/WCSPHTaichiHW

6 Likes

好吧,bug算是解决了吧,其实就是粘度参数给小了。。。
单纯把粘度调大五十倍就行了。。。

还有,突然发现官方给了sph的算例。。。
叫pbf2d.py。。。
话说为啥不直接叫SPH啊。。。

这是参考Postion based dynamics这篇文章写的流体仿真。

哦哦,没仔细看,原来是position based

对比了不同粘性(0.1,1.0,10.0,100.0,0.1-15.0变化)
粘性为0.1
viscosity_0.1
粘性为1.0
viscosity_1.0
粘性为10.0
viscosity_10.0
粘性为100.0
viscosity_100.0
粘性从0.1增加到15.0
viscosity_variable

1 Like

性能分析


可见邻域搜索算法占据约一半的时间

就是不知道有什么方法可以看占用内存的?

1 Like

为了方便各位朋友们后面不踩坑,我总结下自己踩的坑

编程过程中可能会出现的重要BUG总结:
(具体叙述可见代码内word文档)

1 边界溢出问题

这个BUG卡了我将近两个星期。
总结如下:
在利用基于网格的链表搜索法进行邻域搜索时
边界需要一定的padding以防止网格编号溢出

假如每行存储25个网格,一共排列25行。那么网格编号排列如下
image

假如采用如下计算编号的公式:
image
其中[]代表向下取整。posX和posY是粒子位置,4是网格尺寸

举例
对于(100,100), 位于右上,
计算为[100/4]+[100/4]*25=650错误 实际为624
原因
当粒子在上边界和右边界的时候,cell ID的计算会超出网格总数

解决方案

  1. 在边界处增加一些padding(类似页边距)
    如处理右边界的时候增加一个eps的裕量:
        if position[i].x >= boundX - eps:
            position[i].x = boundX - eps
         ...
  1. 同时计算时统一把整体网格向下平移0.5个单位,即采用如下公式:
    cellID=[posX/4-0.5]+[posY/4-0.5]*25
4 Likes